对于给定的日期,例如 2018-03-05,我如何检测它是该月的第一个星期一?
确定该事实后,我如何计算接下来六个月中该月的同一周第 n 天?例如,星期一 2018-04-02 和星期一 2018-05-03。
就像this Question但使用 Java。
我试过这段代码,但没有得到我期望的结果。我的期望:
[2018-04-02, 2018-05-07, 2018-06-04, 2018-07-02, 2018-08-06, 2018-09-03]
可能是我理解错了ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH
.
LocalDate ld = LocalDate.parse( "2018-03-05" );
int alignedDayOfWeekInMonth = ld.get( ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH );
DayOfWeek dayOfWeek = ld.getDayOfWeek();
YearMonth ym = YearMonth.from( ld );
int countMonths = 6;
List < LocalDate > localDates = new ArrayList <>( countMonths );
TemporalAdjuster ta = TemporalAdjusters.dayOfWeekInMonth( alignedDayOfWeekInMonth , dayOfWeek );
for ( int i = 1 ; i <= countMonths ; i++ ) {
LocalDate firstOfMonth = ym.plusMonths( i ).atDay( 1 );
LocalDate localDate = firstOfMonth.with( ta );
localDates.add( localDate );
}
转储到控制台。
System.out.println( "ld.toString(): " + ld );
System.out.println( "alignedDayOfWeekInMonth: " + alignedDayOfWeekInMonth );
System.out.println( "dayOfWeek.toString(): " + dayOfWeek );
System.out.println("ym.toString(): " + ym);
System.out.println( "localDates: " + localDates );
运行时。
ld.toString(): 2018-03-05
alignedDayOfWeekInMonth: 5
dayOfWeek.toString(): MONDAY
ym.toString(): 2018-03
localDates: [2018-04-30, 2018-06-04, 2018-07-02, 2018-07-30, 2018-09-03, 2018-10-01]
一个相关的问题,但使用旧的日期时间类而不是现代的 java.time 类:Find which nth occurrence of a day in a month for a date in Java
最佳答案
这个简单的更改修复了您的程序:
int alignedWeekOfMonth = ld.get(ChronoField.ALIGNED_WEEK_OF_MONTH);
不过,我已经重命名了您的变量 alignedDayOfWeekInMonth
,因此您需要将名称更改传递到您使用它的两个地方。然后你的程序打印:
ld.toString(): 2018-03-05
alignedWeekOfMonth: 1
dayOfWeek.toString(): MONDAY
ym.toString(): 2018-03
localDates: [2018-04-02, 2018-05-07, 2018-06-04, 2018-07-02, 2018-08-06, 2018-09-03]
该列表与您所说的预期一致。
看来您是正确的,因为您误解了 ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH
。引用月份对齐周的概念,3 月 5 日是第 1 对齐周中的第 5 天。您使用的计时字段给了您 5,而不是 1。要获得 1,请改用 ChronoField.ALIGNED_WEEK_OF_MONTH
。然后一切正常。
关于java - 对于给定的日期,检测该月的第 n 个星期几,然后在接下来的 6 个月内用 Java 确定相同的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49934951/