我如何通过添加周数来更改 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.

ofYearDayLocalDatestatic 方法。所以 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 年。

我是怎么知道的?我 运行 你的代码在我的调试器中。那里很清楚。如果您还没有学会使用调试器。我建议现在是最好的时代。