Java时间:获取特定年份的最大周数

时间:2017-05-26 09:15:54

标签: java datetime java-time week-number java-date

我只找到Joda Time的解决方案。

我的解决方案仅在最后一天不在第一周时才有效:

LocalDate.now() // or any other LocalDate
  .withDayOfMonth(31)
  .withMonth(12)
  .get(weekFields.weekOfWeekBasedYear())

那么Java Time中的正确方法是什么(比如Joda Time)?

4 个答案:

答案 0 :(得分:7)

可以使用java.time.* API直接获取此信息。

TemporalField上的关键方法是rangeRefinedBy(Temporal)。它允许您获取一个ValueRange对象,该对象提供字段的最小值和最大值,由传入的时态对象细化。

要了解一年中有多少ISO周,请执行以下操作:

LocalDate date = LocalDate.of(2015, 6, 1);
long weeksInYear = IsoFields.WEEK_OF_WEEK_BASED_YEAR.rangeRefinedBy(date).getMaximum();
System.out.println(weeksInYear);

请注意,您传入的日期用于确定答案。因此,当在1月初或12月下旬传递日期时,请确保您了解基于ISO周的日历如何工作,以及日历年和基于周的年份之间的差异。

答案 1 :(得分:1)

如果无论星期几开始以及一年中的第一部分周有多少天,都希望基于7天获得星期数,则ChronoField.ALIGNED_WEEK_OF_YEAR可能会有所帮助。

例如,基于ISO-8601定义的2016年1月1日(一周从星期一开始,而第一周至少有4天)落入第0周,但在对齐后为第0周1。

    LocalDate date = LocalDate.of(2016, 1, 1);

    int iso8601 = date.get(WeekFields.ISO.weekOfYear()); // result is 0

    int aligned = date.get(ChronoField.ALIGNED_WEEK_OF_YEAR); // result is 1

答案 2 :(得分:0)

似乎当最后一天是第一周时,您不希望1作为答案,而是52/3/4,在这种情况下您可能正在寻找:

LocalDate.of(2017, 12, 31).get(WeekFields.ISO.weekOfYear());

有几种方法可以定义周数 - 如果这不符合您的要求,您需要澄清您想要使用的方法。

答案 3 :(得分:0)

@JodaStephen给出了正确和最佳的解决方案。无论如何,这里有一些替代方案。

12月28日总是在一年的最后一周,因为剩下的三天后不能形成另一周的主要部分:

int weeks = LocalDate.of(2017, 12, 28).get(WeekFields.ISO.weekOfYear());

如果一周开始或结束于星期四,则为53周:

Year year = Year.of(2017);
DayOfWeek firstDay = year.atDay(1).getDayOfWeek();
DayOfWeek lastDay = year.atDay(year.length()).getDayOfWeek();
int weeks = firstDay == DayOfWeek.THURSDAY || lastDay == DayOfWeek.THURSDAY ? 53 : 52;

最后,这将为您提供一年中最后一天的“周数”。如果最后一周的主要部分位于第二年(下一年声明这一周),那么上周的数字是52也是53。

// This will not give the correct number of weeks for a given year
Year year = Year.of(2018);
year.atDay(year.length()).get(WeekFields.ISO.weekOfYear()); // 53

这就是你实际做的事情。