【问题标题】:How can i change year with LocalDate by adding weeks?如何通过添加周来更改 LocalDate 的年份?
【发布时间】:2020-09-28 15:43:55
【问题描述】:

这是我的代码。此方法仅适用于 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);

我怎样才能通过增加周数来增加数年?

【问题讨论】:

  • @OleV.V.谢谢,我已经添加了所有信息。我认为问题在于我用于 firstDayOfWeek 和 LastDayOfWeek 的方法

标签: java android android-studio localdate


【解决方案1】:

您的代码不正确是正确的。当我将 weekChange 设置为 14 并在今天(9 月 29 日)运行时,我得到了 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 的情况并在今天运行。

ld 变为 2021-01-05(从现在起 14 周后的星期二)。此日期是 2021 年的第 1 周,因此 weekNumber 将是 1。

ofYearDayLocalDate静态 方法。所以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 年。

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

【讨论】:

  • 非常感谢,这对我帮助很大。我使用过调试器,但不知道如何更改代码以使其正确。我也学到了一些新东西,所以再次感谢你。
猜你喜欢
  • 2020-05-09
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
  • 2018-12-27
  • 2021-04-06
  • 1970-01-01
相关资源
最近更新 更多