问题描述
这是我的代码。此方法仅适用于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。
ofYearDay
是LocalDate
的 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年。
我怎么知道的?我在调试器中运行了您的代码。那里很清楚看到。如果您尚未学会使用调试器。我建议现在是有史以来最好的。