Java 8 LocalDate:确定每月的星期几(第1,第2,第3等)

Jos*_*man 3 java dayofweek java-8 java-time localdate

我试图弄清楚如何确定特定星期一是某个月的第一个,第二个,第三个还是第四个星期一.我已经弄清楚如何获得使用LocalDate类的下一个星期一和月份的周.

LocalDate now = LocalDate.of(2018, 2, 1);
LocalDate nextMonday = now.with(next(DayOfWeek.MONDAY));
WeekFields weekFields = WeekFields.of(Locale.getDefault());
int week = nextMonday.get(weekFields.weekOfMonth());
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,代码获取下一个星期一及其所在的星期.星期是2月的第二周,但是星期一不是第二个星期一,它是第一个星期一.任何有关这方面的帮助将不胜感激.

Ole*_*.V. 8

你不应该使用自己的算术.使用内置功能:

    int week = nextMonday.get(ChronoField.ALIGNED_WEEK_OF_MONTH);
Run Code Online (Sandbox Code Playgroud)

使用代码中的日期,可以得到:

1
Run Code Online (Sandbox Code Playgroud)

这意味着你得到的星期一(2月5日)是这个月的第一个星期一.此外,您不需要任何一个,WeekFields因为该月的第一个星期一是该月的第一个星期一,无论哪一天是一周的第一天,或一年中的几周如何编号.

日期算术通常很复杂,容易出错.这也意味着即使你最终得到正确的计算,读者也很难说服自己/你自己你的代码是正确的.因此,最好使用我们信任的内置功能进行测试,并使用解释性名称而不是1和7之类的数字.

您可能会惊讶于要调用的字段ALIGNED_WEEK_OF_MONTH.将对齐的周数视为从本月1日开始的一周,无论是星期几,以及接下来的几周.2018年2月,第一个对齐的一周从2月1日星期四到2月7日星期三.以下一致的星期从2月8日星期四,2月15日和2月22日开始.显然,本月的第一个星期一是在第1周,第2个星期一,在第2周,等等.因此它可以使用ALIGNED_WEEK_OF_MONTH.