从日历周信息创建 LocalDate
Create LocalDate from Calendar Week Information
给定:
- 年份:2019
- 日历周数:1(== 一年的第一周)
- 一周中的一天:星期日
需要:
将这些信息 f 转换为 LocalDate 对象,以便
assertEquals(LocalDate.of(2019,1,6), f(2019,1,SUNDAY))
我试过的
我没有找到使用 java.time.* 从像 "The Sunday of the first calender week in 2019" 这样的信息创建日期的方法。我发现旧的 java.util.Calendar class 有一个可能有用的 setWeekDate() 函数。但是以下代码导致异常:
...
Calendar c = Calendar.getInstance();
c.setWeekDate(2019, 1, Calendar.MONDAY);
c.setTimeZone(TimeZone.getDefault());
return LocalDate.from(c.toInstant());
java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: 2018-01-08T20:03:55.602Z of type java.time.Instant
at java.time.LocalDate.from(LocalDate.java:379)
at ...
检查 ChronoField 或 IsoFields 以获得适合您要使用的日历系统的星期。 LocalDate
用作 "base" 值的对象应该具有预期年份的周值。
int year = 2019;
int weekNumber = 1;
LocalDate localDate = LocalDate.of(year, 2, 1)
.with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, weekNumber)
.with(ChronoField.DAY_OF_WEEK, DayOfWeek.SUNDAY.getValue());
选择第一个日期是有意义的。使用 LocalDate.of(year, 1, 1)
会给出属于前一年最后一周的一天,LocalDate.now()
也是如此,但仅适用于给定的时间段。
LocalDate.of(2017, 1, 1)
.with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, 26)
.with(ChronoField.DAY_OF_WEEK, DayOfWeek.SUNDAY.getValue());
// 2016-07-03
LocalDate.of(2017, 1, 1).get(IsoFields.WEEK_OF_WEEK_BASED_YEAR);
// 52
所以从第 52 周跳到第 26 周会得出日期 2016-07-03,因为日期是通过减去第 52 周和第 26 周之间的时间计算的。
有关 withYear
的更多讨论,请参阅此处的答案:
给定:
- 年份:2019
- 日历周数:1(== 一年的第一周)
- 一周中的一天:星期日
需要:
将这些信息 f 转换为 LocalDate 对象,以便
assertEquals(LocalDate.of(2019,1,6), f(2019,1,SUNDAY))
我试过的
我没有找到使用 java.time.* 从像 "The Sunday of the first calender week in 2019" 这样的信息创建日期的方法。我发现旧的 java.util.Calendar class 有一个可能有用的 setWeekDate() 函数。但是以下代码导致异常:
...
Calendar c = Calendar.getInstance();
c.setWeekDate(2019, 1, Calendar.MONDAY);
c.setTimeZone(TimeZone.getDefault());
return LocalDate.from(c.toInstant());
java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: 2018-01-08T20:03:55.602Z of type java.time.Instant
at java.time.LocalDate.from(LocalDate.java:379)
at ...
检查 ChronoField 或 IsoFields 以获得适合您要使用的日历系统的星期。 LocalDate
用作 "base" 值的对象应该具有预期年份的周值。
int year = 2019;
int weekNumber = 1;
LocalDate localDate = LocalDate.of(year, 2, 1)
.with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, weekNumber)
.with(ChronoField.DAY_OF_WEEK, DayOfWeek.SUNDAY.getValue());
选择第一个日期是有意义的。使用 LocalDate.of(year, 1, 1)
会给出属于前一年最后一周的一天,LocalDate.now()
也是如此,但仅适用于给定的时间段。
LocalDate.of(2017, 1, 1)
.with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, 26)
.with(ChronoField.DAY_OF_WEEK, DayOfWeek.SUNDAY.getValue());
// 2016-07-03
LocalDate.of(2017, 1, 1).get(IsoFields.WEEK_OF_WEEK_BASED_YEAR);
// 52
所以从第 52 周跳到第 26 周会得出日期 2016-07-03,因为日期是通过减去第 52 周和第 26 周之间的时间计算的。
有关 withYear
的更多讨论,请参阅此处的答案: