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() ;
将该值调整为同月的第一天。使用 TemporalAdjusters 类中的 TemporalAdjuster 实现。
LocalDate firstOfMonth = ld.with( TemporalAdjusters.firstDayOfMonth() ) ;
通过DayOfWeek 枚举对象确定该月初日期的星期几。该枚举预定义了 7 个对象,一个用于一周中的每一天:MONDAY、TUESDAY 等。
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.Date、Calendar、GregorianCalendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。