根据年份和年份中的星期获取 LocalDateTime

Get LocalDateTime based on year and week of year

我有两个整数:yearweek。我想从这两个值构造一个 LocalDateTime,其中日期代表特定年份特定周的第一天。

我已经试过了:

LocalDateTime ldt = LocalDateTime.of(year, 1, 1, 0, 0).plusWeeks(week-1);

这并没有给出正确的结果,因为一年的第一天并不总是那年第一周的开始。我似乎也不知道如何获得第一周的第一天。

有什么简单的方法可以用 Java 8 中的日期和时间 API 做到这一点?

注意:我知道我也可以根据给出的答案创建一个解决方法 ,但这似乎牵强附会。也许不是,如果是,请告诉我!

您可以尝试解析您感兴趣的日期的字符串表示形式:

private static final DateTimeFormatter YEAR_WEEK = DateTimeFormatter.ofPattern("YYYY-w-e", Locale.getDefault());

public static LocalDate fromYearWeek(int year, int week) {
  return LocalDate.parse(year + "-" + week + "-1", YEAR_WEEK);
}

如果您需要 LocalDateTime,则可以使用 localDate.atTime(...)localDate.atStartOfDay() 例如。

以下代码将获取 LocalDateTime 并将其设置为给定年份的给定星期的第一天:

int week = 1;
int year = 2016;
WeekFields weekFields = WeekFields.of(Locale.getDefault());
LocalDateTime ldt = LocalDateTime.now()
                            .withYear(year)
                            .with(weekFields.weekOfYear(), week)
                            .with(weekFields.dayOfWeek(), 1);
System.out.println(ldt);

请注意,一年中的一周的概念是特定于语言环境的。在这里,我使用了默认的语言环境,但您可能需要使用用户提供的语言环境。

如果你想去掉时间部分,你可以添加对truncatedTo(ChronoUnit.DAYS)的调用。

LocalDate ld = LocalDate.parse("2012-W48-1", DateTimeFormatter.ISO_WEEK_DATE);

三十加

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as YearWeek.

如果“周”是指标准 ISO 8601 definition of a week-of-year where the week # 1 contains the first Thursday of the year, let the YearWeek class 为您完成工作。

int weekBasedYear = 2015;  // Not the calendar year!
int weekOfYear = 1;
YearWeek yearWeek = YearWeek.of ( weekBasedYear , weekOfYear );

您可以获得在 LocalDate 对象中表示的仅限日期的值。使用 DayOfWeek 枚举指定您想要的星期几,其中星期一是一周的第一天,星期日是最后一天。请记住,ISO 周总是从星期一开始,总是在星期日结束。

LocalDate mondayOfYearWeek = yearWeek.atDay ( DayOfWeek.MONDAY );
LocalDate sundayOfYearWeek = yearWeek.atDay ( DayOfWeek.SUNDAY );

转储到控制台。请注意一周是如何从上一个日历年(2014 年)开始并在 2015 年结束的,因为 2015 年 1 月 1 日是星期四,所以它标志着 ISO 第 1 周。接下来的星期日,2015 年 1 月 4 日结束了 ISO 第 1 周。

System.out.println ( "yearWeek: " + yearWeek + " starts on mondayOfYearWeek: " + mondayOfYearWeek + " and ends on sundayOfYearWeek: " + sundayOfYearWeek );

yearWeek: 2015-W01 starts on mondayOfYearWeek: 2014-12-29 and ends on sundayOfYearWeek: 2015-01-04