是否有提供该月第一天的功能?

时间:2018-01-17 20:17:06

标签: java dayofweek java-date dayofmonth

在Java中,我可以通过这种方式获得本月的第一天:

GregorianCalendar date;
// Some code
int first = new GregorianCalendar(date.get(Calendar.YEAR),
            date.get(Calendar.MONTH), 1).get(Calendar.DAY_OF_WEEK);

我想知道是否有直接这样做的功能,因为我找不到能够抓住这些重要信息的功能。

类似于我在这里尝试做的事情:

 for (int i = 1; i < days_in_month + first; i++) {
     // Some code
     if (i - first + 1 == date.get(Calendar.DAY_OF_MONTH)) {
         // Do something
     }
 }

3 个答案:

答案 0 :(得分:4)

您可以将GregorianCalendar对象转换为LocalDate对象,并使用它方便的API:

LocalDate getWithFirstDayOfMonth(GregorianCalendar c) {
    LocalDate date = c.toZonedDateTime().toLocalDate();
    return date.withDayOfMonth(1);
}

GregorianCalendar calendar = GregorianCalendar.from(ZonedDateTime.now());
LocalDate first = getWithFirstDayOfMonth(calendar);
System.out.println(first.getDayOfMonth());

答案 1 :(得分:1)

简单地说,不。这是获得这样的东西的正确方法。

这实际上是他们在Java中用于进行这样的计算的功能。任何类型的&#34;直接功能&#34;我会在内部做这件事(我建议你这样做。)

答案 2 :(得分:1)

TL;博士

获取表示星期几(星期一至星期日为1-7)的整数,表示某一年的第一天:

myGregCal                                        // Avoid troublesome legacy date-time classes such as `GregorianCalendar`.
    .toZonedDateTime()                           // Convert from legacy class to modern java.time class, a `ZonedDateTime` object.
    .toLocalDate()                               // Extract a date-only object.        
    .with( TemporalAdjusters.firstDayOfMonth() ) // Adjust into first day of the same year-month.
    .getDayOfWeek()                              // Extract a `DayOfWeek` enum object for Monday, Tuesday, etc. Consider using this object directly rather than taking the next step to extract a `int` number.
    .getValue()                                  // Extract an `int` integer number, 1-7 for Monday-Sunday.

...周一至周日的数字为1-7。

提示:最好跳过最后一步,使用DayOfWeek对象代替int

myGregCal.toZonedDateTime().toLocalDate().with( TemporalAdjusters.firstDayOfMonth() ).getDayOfWeek()  // Render a `DayOfWeek` enum object.

java.time

Answer by Oleksandr可能是正确的,并且使用现代java.time类而不是旧的日期时间类赢得积分。但是对这样的代码有一个更简单的看法。此外,该问题似乎想要更进一步,以获得第一个月的星期几。

根据Andreas的评论,您可以将GregorianCalendar::toZonedDateTime称为从旧版遗留类GregorianCalendar转换为现代ZonedDateTime类的简便方法。旧类获得了新方法,以便于在遗留类和现代 java.time 类之间进行转换。

ZonedDateTime zdt = myGregCal.toZonedDateTime() ;  // Convert from legacy class to modern class.

从那里提取LocalDate个对象。 LocalDate类表示没有时间且没有时区的仅限日期的值。

LocalDate ld = zdt.toLocalDate() ;

将值调整为同月的第一天。使用TemporalAdjuster类中的TemporalAdjusters实现。

LocalDate firstOfMonth = ld.with( TemporalAdjusters.firstDayOfMonth() ) ;

通过DayOfWeek枚举对象确定第一个月日期的星期几。该枚举预定义了7个对象,一个星期中的每一天:MONDAYTUESDAY等。

DayOfWeek dow = firstOfMonth.getDayOfWeek() ;

考虑使用DayOfWeek枚举对象而不仅仅是笨拙的int数字来表示您的星期几。使用对象而不是int原语使您的代码更加自我记录,提供类型安全性并确保有效值。

但如果你坚持,你可以按照ISO 8601标准为周一至周日提取int 1-7。

int dowNumber = dow.getValue() ;

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarGregorianCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore