java - 从日历周信息创建 LocalDate
问题描述
鉴于:
- 一年:2019
- 日历周数:1(== 一年中的第一周)
- A DayOfWeek: 星期日
需要:
将这些信息 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 ...
解决方案
检查 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
:意外的日期计算结果
推荐阅读
- c++ - 在 SPOJ 上出现运行时错误(SIGSEGV),无法找出我的代码有什么问题
- python - 通过分组值创建新列的最佳方法是什么?
- python-3.8 - 我想使用用户输入(字符)使用 python 更改文本文件中的第 35 个字符
- java - 如何编写一个java for循环来加载给定一组id和值列表的地图
- javascript - 为什么这段代码不起作用?我正在创建一个 Firefox 扩展,但代码没有运行。但是,如果我将代码粘贴到控制台中,它就可以工作
- angular - 如何在jspdf中对齐图像
- javascript - Img 项目符号出现在 React.js 段落的上方
- python - 使用列表在循环中引用列
- mongodb - 在strapi中创建记录时如何设置随机ID?
- javascript - 使用时刻将服务器的默认时区转换为本地用户时间?