给出:
需要:
将这些信息f转换为LocalDate对象,以便
assertEquals(LocalDate.of(2019,1,6), f(2019,1,SUNDAY))
我尝试过的事情
我没有找到使用java.time。*的方法从信息中创建日期的方法,例如“ 2019年第一个日历周的星期日”。我发现旧的java.util.Calendar类具有可能有用的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 ...
答案 0 :(得分:5)
检查ChronoField或IsoFields是否有合适的方法来获取要使用的日历系统的星期数。用作“基本”值的LocalDate
对象应具有预期年份的星期值。
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
:Unexpected date calculation result