代码之家  ›  专栏  ›  技术社区  ›  Allain Lalonde

给定日期对象,如何确定其月份的最后一天?

  •  6
  • Allain Lalonde  · 技术社区  · 16 年前

    我正在尝试使用以下代码,但它返回的日期不正确。

    Calendar cal = Calendar.getInstance();
    cal.setTime(sampleDay.getTime());
    cal.set(Calendar.MONTH, sampleDay.get(Calendar.MONTH)+1);
    cal.set(Calendar.DAY_OF_MONTH, 0);
    return cal.getTime();
    
    8 回复  |  直到 7 年前
        1
  •  17
  •   Argelbargel    16 年前

    获取本月的天数:

    
    Calendar cal = Calendar.getInstance();
    cal.setTime(sampleDay.getTime());
    int noOfLastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
    

    将日历设置为本月的最后一天:

    
    Calendar cal = Calendar.getInstance();
    cal.setTime(sampleDay.getTime());
    cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
    
        2
  •  3
  •   Stephen Wrighton    16 年前

    我将为下个月的第一天创建一个日期对象,然后从日期对象中减去一天。

        3
  •  3
  •   Basil Bourque    7 年前

    DR

    YearMonth.from(
        LocalDate.now( ZoneId.of( "America/Montreal" ) )
    ).atEndOfMonth()
    

    Java.时间

    这个问题和其他答案使用过时的旧课程。他们已经被 java.time 构建到Java 8和以后的类。见 Oracle Tutorial . 许多功能已经被移植到Java 6和7中。 ThreeTen-Backport 并进一步适应安卓 ThreeTenABP .

    LocalDate

    这个 LocalDate 类表示没有时间和时区的仅日期值。虽然这些对象不存储时区,但请注意,时区对于确定当前日期至关重要。在任何给定的时刻,日期都会随着时区的不同而变化。

    ZoneId zoneId = ZoneId.of( "America/Montreal" );
    LocalDate today = LocalDate.now( zoneId );  // 2016-06-25
    

    YearMonth

    结合 YearMonth 类来确定任何月份的最后一天。

    YearMonth currentYearMonth = YearMonth.from( today );  // 2016-06
    LocalDate lastDayOfCurrentYearMonth = currentYearMonth.atEndOfMonth();  // 2016-06-30
    

    顺便问一下,两个都是 本地日期 年月 使用您期望的月份编号(1-12),而不是旧日期时间类中看到的螺旋球0-11。许多糟糕的设计决策之一,使那些旧的约会时间类变得如此麻烦和混乱。

    TemporalAdjuster

    另一个有效的方法是使用 TemporalAdjuster . 见 the correct Answer by Pierre Henry .

        4
  •  2
  •   paul    16 年前

    使用calObject.getActualMaximum(calObject.day_of_month)

    Real's Java How-to 了解更多信息。

        5
  •  2
  •   Peter Hilton    16 年前

    您似乎将日历设置为下个月的第一天,因此您需要再减去一天,以得到该月的最后一天。 采邑日 在:

    Calendar cal = Calendar.getInstance();
    cal.setTime(sampleDay.getTime());
    cal.roll(Calendar.MONTH, true);
    cal.set(Calendar.DAY_OF_MONTH, 0);
    cal.add(Calendar.DAY_OF_MONTH, -1);
    

    一般来说,使用 Joda Time 如:

    DateTime date = new DateTime(sampleDay.getTime());
    return date.plusMonths(1).withDayOfMonth(0).minusDays(1).getMillis();
    
        6
  •  2
  •   Basil Bourque    7 年前

    TemporalAdjuster

    使用(相对) 新的Java日期API 实际上非常简单:

    date 成为 LocalDate 例如:

    LocalDate date = LocalDate.of(2018, 1, 22);
    

    LocalDate date = LocalDate.now();
    

    或者,当然,您可以从数据库等获取它作为用户输入。

    然后应用 TemporalAdjuster 在中找到的接口 TemporalAdjusters 班级:

    LocalDate first = date.with(TemporalAdjusters.firstDayOfMonth());
    LocalDate last = date.with(TemporalAdjusters.lastDayOfMonth());
    
        7
  •  1
  •   John    14 年前

    如果您使用 date4j 图书馆:

    DateTime monthEnd = dt.getEndOfMonth();
    
        8
  •  -1
  •   durron597    12 年前

    我认为这应该很有效:

    Dim MyDate As Date = #11/14/2012#  'This is just an example date
    
    MyDate = MyDate.AddDays(DateTime.DaysInMonth(MyDate.Year, MyDate.Month) - MyDate.Day)