我如何通过添加周数来更改 LocalDate 的年份?
How can i change year with LocalDate by adding weeks?
这是我的代码。此方法仅适用于 1(当年)。当周数大于 53 时,日期从当年第一周的日期开始,而不是下一周的日期。
一年有 52 或 53 周,所以当最后一周 (52 或 53) 我有 2020-12-28 - 2021-01-03,但是当我想要明年的第一周 (2021-01-04 - 2021-01- 10) 它输出我从 2020 年开始的第一周(2019-12-30 - 2020-01-05)。
public void showPreviousNextWeekDays(DataBaseHelper dataBaseHelper, long weekChange) {
if (weekChange >= 0) {
LocalDate ld = LocalDate.now().plusWeeks(weekChange);
final long weekNumber = ld.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR); //takes week from current date
LocalDate firstDayOfWeek = ld.ofYearDay(ld.getYear(), (int)weekNumber)
.with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, weekNumber)
.with(DayOfWeek.MONDAY);
LocalDate lastDayOfWeek = ld.ofYearDay(ld.getYear(), (int)weekNumber)
.with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, weekNumber)
.with(DayOfWeek.SUNDAY);
String firstAndLastDayOfWeek = firstDayOfWeek.toString() + " - " + lastDayOfWeek.toString();
daysArrayAdapter = new ArrayAdapter<DayModel>(getActivity(), android.R.layout.simple_list_item_1, db.NextWeek(weekChange));
daysList.setAdapter(daysArrayAdapter);
如何通过增加周数来推进年数?
你是对的,你的代码不正确。当我今天(9 月 29 日)将 weekChange
设置为 14 和 运行 时,我得到 2019-12-30 - 2020-01-05
,预期结果为 2021-01-04 - 2020-01-10
。同样对于 15 周和 16 周,您的代码可以追溯到今年年初的一周,而不是像它应该的那样找到明年年初的一周。
我建议如下,也比较简单:
int weekChange = 14;
LocalDate ld = LocalDate.now(ZoneId.systemDefault()).plusWeeks(weekChange);
LocalDate firstDayOfWeek = ld.with(DayOfWeek.MONDAY);
LocalDate lastDayOfWeek = ld.with(DayOfWeek.SUNDAY);
String firstAndLastDayOfWeek = firstDayOfWeek.toString() + " - " + lastDayOfWeek.toString();
System.out.println(firstAndLastDayOfWeek);
今天运行时的输出:
2021-01-04 - 2021-01-10
如果没有明确指示,LocalDate
使用 ISO 日历系统,包括 ISO 周。所以我们可以确定 ld.with(DayOfWeek.MONDAY)
在同一个 ISO 周的开始给我们星期一。同样 ld.with(DayOfWeek.SUNDAY)
在 ISO 周结束时给我们星期天。所以没有更多的了。
您的代码中发生了什么?
坚持今天 weekChange
14 和 运行ning 的情况。
ld
变为 2021-01-05(从现在起第 14 周的星期二)。此日期是 2021 年的第 1 周,因此 weekNumber
将为 1.
ofYearDay
是 LocalDate
的 static 方法。所以 ld.ofYearDay(ld.getYear(), (int)weekNumber)
给你的日期与你从 LocalDate.ofYearDay(ld.getYear(), (int)weekNumber)
得到的日期相同。它不使用 ld
做任何事。由于 weekNumber
为 1,因此您得到 2021 年的第 1 天,因此 2021-01-01
。将周数作为一年中的第几天传递给 ofYearDay()
是没有意义的。 2021-01-01 恰好在 2020 年的第 53 周。因此 with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, weekNumber)
将日期调整回 2020 年的第 1 周。这是我们错了一年的地方。结果是 2020-01-03。该周的星期一是 2019-12-30,这解释了为什么您在输出中将其作为一周的第一天。
一周的最后一天也差不多。周数 2 和 3 相似,因为您将周数用作一年中的一天,而 1 月 2 日和 3 日也属于上一年的最后一周,即 2020 年。
我是怎么知道的?我 运行 你的代码在我的调试器中。那里很清楚。如果您还没有学会使用调试器。我建议现在是最好的时代。
这是我的代码。此方法仅适用于 1(当年)。当周数大于 53 时,日期从当年第一周的日期开始,而不是下一周的日期。 一年有 52 或 53 周,所以当最后一周 (52 或 53) 我有 2020-12-28 - 2021-01-03,但是当我想要明年的第一周 (2021-01-04 - 2021-01- 10) 它输出我从 2020 年开始的第一周(2019-12-30 - 2020-01-05)。
public void showPreviousNextWeekDays(DataBaseHelper dataBaseHelper, long weekChange) {
if (weekChange >= 0) {
LocalDate ld = LocalDate.now().plusWeeks(weekChange);
final long weekNumber = ld.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR); //takes week from current date
LocalDate firstDayOfWeek = ld.ofYearDay(ld.getYear(), (int)weekNumber)
.with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, weekNumber)
.with(DayOfWeek.MONDAY);
LocalDate lastDayOfWeek = ld.ofYearDay(ld.getYear(), (int)weekNumber)
.with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, weekNumber)
.with(DayOfWeek.SUNDAY);
String firstAndLastDayOfWeek = firstDayOfWeek.toString() + " - " + lastDayOfWeek.toString();
daysArrayAdapter = new ArrayAdapter<DayModel>(getActivity(), android.R.layout.simple_list_item_1, db.NextWeek(weekChange));
daysList.setAdapter(daysArrayAdapter);
如何通过增加周数来推进年数?
你是对的,你的代码不正确。当我今天(9 月 29 日)将 weekChange
设置为 14 和 运行 时,我得到 2019-12-30 - 2020-01-05
,预期结果为 2021-01-04 - 2020-01-10
。同样对于 15 周和 16 周,您的代码可以追溯到今年年初的一周,而不是像它应该的那样找到明年年初的一周。
我建议如下,也比较简单:
int weekChange = 14;
LocalDate ld = LocalDate.now(ZoneId.systemDefault()).plusWeeks(weekChange);
LocalDate firstDayOfWeek = ld.with(DayOfWeek.MONDAY);
LocalDate lastDayOfWeek = ld.with(DayOfWeek.SUNDAY);
String firstAndLastDayOfWeek = firstDayOfWeek.toString() + " - " + lastDayOfWeek.toString();
System.out.println(firstAndLastDayOfWeek);
今天运行时的输出:
如果没有明确指示,2021-01-04 - 2021-01-10
LocalDate
使用 ISO 日历系统,包括 ISO 周。所以我们可以确定 ld.with(DayOfWeek.MONDAY)
在同一个 ISO 周的开始给我们星期一。同样 ld.with(DayOfWeek.SUNDAY)
在 ISO 周结束时给我们星期天。所以没有更多的了。
您的代码中发生了什么?
坚持今天 weekChange
14 和 运行ning 的情况。
ld
变为 2021-01-05(从现在起第 14 周的星期二)。此日期是 2021 年的第 1 周,因此 weekNumber
将为 1.
ofYearDay
是 LocalDate
的 static 方法。所以 ld.ofYearDay(ld.getYear(), (int)weekNumber)
给你的日期与你从 LocalDate.ofYearDay(ld.getYear(), (int)weekNumber)
得到的日期相同。它不使用 ld
做任何事。由于 weekNumber
为 1,因此您得到 2021 年的第 1 天,因此 2021-01-01
。将周数作为一年中的第几天传递给 ofYearDay()
是没有意义的。 2021-01-01 恰好在 2020 年的第 53 周。因此 with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, weekNumber)
将日期调整回 2020 年的第 1 周。这是我们错了一年的地方。结果是 2020-01-03。该周的星期一是 2019-12-30,这解释了为什么您在输出中将其作为一周的第一天。
一周的最后一天也差不多。周数 2 和 3 相似,因为您将周数用作一年中的一天,而 1 月 2 日和 3 日也属于上一年的最后一周,即 2020 年。
我是怎么知道的?我 运行 你的代码在我的调试器中。那里很清楚。如果您还没有学会使用调试器。我建议现在是最好的时代。