1 回答
TA贡献1803条经验 获得超6个赞
这里的关键是理解几点:
您以两种不同的方式计算周数。对于您使用 ISO 编号的一年中的一周:一年中的第一周至少包括新年的 4 天。对于一个月中的一周,您正在计算星期一(您可以说该月的第一周是包括该月七天而不是四天的那一周)。
周数可能并不总是存在。如果您的起点是该月的第 0 周或第 5 周,则前一个月可能没有该周。
获得的结果与预期的不同。我认为问题是由于我没有指定如何计算该月的第一周(该月的第一个星期一)。这样对吗?我该如何解决?
你是对的。要计算每月的星期一,您可以使用:
LocalDate tempDate = date.withYear(2019) .withMonth(i) .with(ChronoField.DAY_OF_WEEK, DayOfWeek.MONDAY.getValue()) .with(ChronoField.ALIGNED_WEEK_OF_MONTH, weekMonth);
(当然DayOfWeek.MONDAY.getValue()
只是罗嗦的说法1
,但更能表达意图,所以我更喜欢它。)
通过对您的代码进行此更改,输出是预期的:
2 6 10 14 19 23 27
关键是ChronoField.ALIGNED_WEEK_OF_MONTH
。一个月的对齐星期从该月的 1 号开始,并且无论星期几如何,始终为 7 天。第一个对齐的周是从该月的 1 号到 7 号,如果是从 8 号到 14 号,则第二个对齐的周是等等。因为我们已经将星期几设置为星期一,所以将对齐的星期设置为 1 给我们第一个星期一月份等
我们还没有完成。如果我设置weekNumber
为 40,我会得到:
2 6 10 14 14 23 27 27 36 41
我原以为 40 是列表中的最后一个数字,但它不在那里。2019 年的第 40 周是从 9 月 30 日星期一到 10 月 6 日,所以如果我理解正确的话,你想要那些有第 5 周的月份的第 5 周。这让我们回到并非所有月份都有第 5 周的问题(因为他们没有 5 个星期一)。发生的事情是,由于我在星期二运行您的代码,因此以第 40 周的星期二(即 10 月 1 日)为起点,因此给了我每个月的第 1 周而不是第 5 周。
有更好的解决方案吗?你能推荐一个吗?
我真的不能。你得到的很好。
只有你没有使用int weekYear
参数。您可能想用它代替weekNumber
局部变量。在任何情况下,您都应该删除其中一个并使用另一个。
这个不相关的提示:您使用LocalDate.from(someLocalDate)
是多余的,因为它只会再次给您相同的LocalDate
对象(相同的对象或相同的对象,我不知道或不在乎)。只是在那些情况下使用someLocalDate
。
添加回答
举报