从日历周信息创建LocalDate

问题描述 投票:1回答:1

鉴于:

  • 一年:2019年
  • 日历周数:1(= =一年的第一周)
  • DayOfWeek:SUNDAY

需要:

将这些Infos转换为LocalDate对象,以便

assertEquals(LocalDate.of(2019,1,6), f(2019,1,SUNDAY))

我尝试了什么

我没有找到java.time。*的方法来创建一个来自Info的日期,比如“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 ...
java datetime week-number localdate
1个回答
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()but仅在给定的时间段内。

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周之间的跟踪时间来计算的。

有关withYearUnexpected date calculation result的更多讨论,请参阅此处的答案

© www.soinside.com 2019 - 2024. All rights reserved.