在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
}
}
答案 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)
获取表示星期几(星期一至星期日为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.
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个对象,一个星期中的每一天:MONDAY,TUESDAY等。
DayOfWeek dow = firstOfMonth.getDayOfWeek() ;
考虑使用DayOfWeek
枚举对象而不仅仅是笨拙的int
数字来表示您的星期几。使用对象而不是int
原语使您的代码更加自我记录,提供类型安全性并确保有效值。
但如果你坚持,你可以按照ISO 8601标准为周一至周日提取int
1-7。
int dowNumber = dow.getValue() ;
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
,GregorianCalendar
和&amp; 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。