java - 对于给定的日期,检测该月的第 n 个星期几,然后在接下来的 6 个月内用 Java 确定相同的日期

标签 java java-time dayofweek

对于给定的日期,例如 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/

相关文章:

java - 如何让 jaxb 插件使用 OffsetDateTime

java - 将 java.time.temporal.Temporal 转换为 java.util.Date

python - 在python中查找给定日期的日期

java - 在哪里可以下载 JNLP 1.2?

java - ActionListener 失败 - Java For-Each 分配给 JMenuItem

java - 使用 Java 8 java.time.* 进行时间计算

c# - 在字符串数组中查找下一个可用日期

java - 如何检查一天是否位于范围之间?

java - 当互联网连接关闭时显示警报

java - 下载适用于 MAC High Sierra 的 Legacy JVM 版本 1.8