java - 从日历周信息创建 LocalDate

标签 java datetime week-number localdate

给定:

  • 年份:2019
  • 日历周数:1(== 一年的第一周)
  • 一周中的一天:星期日

需要:

将这些信息 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 的更多讨论,另请参阅此处的答案:Unexpected date calculation result

关于java - 从日历周信息创建 LocalDate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54794707/

相关文章:

c# - System.Globalization.Calendar.GetWeekOfYear() 返回奇怪的结果

java - API 21 new DatePicker Show Week Number 崩溃

c# - 获取不同开始日期的周数

java - 安卓 Java : AlertDialog method called from another class causes null pointer exception

r - 在 R 中将日期转换为 as.POSIXct 并减去两个日期

java - 是否可以在 for 或 while 循环中声明引用变量?

php - 如何使用php在两个日期之间生成随机日期?

java - 获取 Java 日期的上周日期范围

java.lang.SecurityException : class "XYZ"'s signer information does not match signer information of other classes in the same package 错误

java - 如何将某些数据对象设置为 JFace TableViewer 行