如何通过增加星期数来更改LocalDate的年份?

问题描述

这是我的代码。此方法仅适用于1(当前年份)。当星期数大于53时,日期从当年第一周的日期开始,而不是下一年。 年有52或53周,所以当最后一周(52or53)时,我有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);

如何通过增加几周来继续前进?

解决方法

您是正确的,您的代码是不正确的。当我将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 static 方法。因此,ld.ofYearDay(ld.getYear(),(int)weekNumber)会给您与LocalDate.ofYearDay(ld.getYear(),(int)weekNumber)相同的日期。它不使用ld。由于weekNumber为1,因此您获得2021年的第一天,因此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年。

我怎么知道的?我在调试器中运行了您的代码。那里很清楚看到。如果您尚未学会使用调试器。我建议现在是有史以来最好的。