【问题标题】:Create LocalDate from Calendar Week Information从日历周信息创建 LocalDate
【发布时间】:2019-07-14 15:16:54
【问题描述】:

鉴于:

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

需要:

将这些信息转换为 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 ...

【问题讨论】:

  • “一年中的第一周” - 这周是从 1 月 1 日开始吗?
  • 您不想使用设计不佳且早已过时的Calendar 类。 java.time 提供了您需要的所有功能。但是,作为@JacobG。提示,您需要定义“日历周数”,因为存在多个标准。
  • @Mika 的解决方案正是我所需要的。

标签: java datetime week-number localdate


【解决方案1】:

检查 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

【讨论】:

  • 有趣。甚至不知道 IsoFields 和 ChronoField 的存在。谢谢!
  • 这不起作用!以 2017/26 年为例。您需要通过 LocalDate.now().with(2019) 创建 LocalDate 参见:stackoverflow.com/questions/47259213/…
  • @KFleischer 很棒的发现!
猜你喜欢
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-31
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多