我只找到Joda Time的解决方案。
我的解决方案仅在最后一天不在第一周时才有效:
LocalDate.now() // or any other LocalDate
.withDayOfMonth(31)
.withMonth(12)
.get(weekFields.weekOfWeekBasedYear())
那么Java Time中的正确方法是什么(比如Joda Time)?
答案 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
这就是你实际做的事情。