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

Is there a function to provide the first day of the month?

在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
     }
 }

简单地说,没有。这是获得类似内容的正确方法。

这实际上是他们在 Java 中加入的功能,可以让这样的计算成为可能。任何类型的 "direct function" 都会在内部简单地执行此操作(我建议你这样做。)

可以将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());

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

可能是正确的,并且使用现代 java.time classes 而不是遗留日期时间 classes 赢得积分。但是对这样的代码有一个更简单的理解。此外,问题似乎想更进一步,以获得第一个月的星期几。

根据 Andreas 的评论,您可以调用 GregorianCalendar::toZonedDateTime 作为从旧遗留 class GregorianCalendar 转换为现代 ZonedDateTime [=132] 的简单方法=].旧的 classes 获得了新的方法来促进遗留 classes 和现代 java.time classes 之间的转换。

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

从那里提取一个 LocalDate 对象。 LocalDate class 表示没有时间和时区的仅日期值。

LocalDate ld = zdt.toLocalDate() ;

将值调整为同月的第一天。使用 TemporalAdjuster implementation found in the TemporalAdjusters class.

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

通过 DayOfWeek enum object. That enum pre-defines 7 objects, one for each day of the week: MONDAY, TUESDAY 等方式确定第一个月的日期

DayOfWeek dow = firstOfMonth.getDayOfWeek() ;

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

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

int dowNumber = dow.getValue() ;

关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, GregorianCalendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

从哪里获得java.time classes?

  • Java SE 8, Java SE 9,及以后
    • 内置。
    • 标准 Java API 的一部分,带有捆绑实施。
    • Java 9 添加了一些小功能和修复。
  • Java SE 6 and Java SE 7
  • Android
    • Android java.time classes.
    • 捆绑实施的更高版本
    • 对于较早的 Android,ThreeTenABP project adapts ThreeTen-Backport (mentioned above). See

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.