根据年份和年份获取LocalDateTime

时间:2015-09-28 11:47:08

标签: java datetime java-8 java-time

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

我已经尝试过了:

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

这不会给出正确的结果,因为一年的第一天并不总是该年第一周的开始。我似乎无法弄清楚如何获得第一周的第一天。

使用Java 8中的日期和时间API有没有简单的方法呢?

注意:我知道我也可以创建一个给定here答案的解决方法,但这似乎有些牵强。也许它不是,如果是的话,请告诉我!

4 个答案:

答案 0 :(得分:11)

以下代码将获得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);

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

如果您想摆脱时间部分,可以添加对truncatedTo(ChronoUnit.DAYS)的通话。

答案 1 :(得分:3)

您可以尝试解析您感兴趣的那一天的字符串表示:

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()作为示例。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

ThreeTen-EXTRA

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如YearWeek

如果按“周”表示标准ISO 8601 definition of a week-of-year,其中第1周包含一年中的第一个星期四,请让YearWeek班为您完成工作。

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从星期一开始,每年周日:2014-12-29,并于星期日结束,每年周日:2015-01-04