2017-05-26 177 views
2

我只找到了Joda Time的解决方案。Java时间:获得特定年份的最大周数

我的解决办法只能如果最后一天不在第一周:

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

那么,什么是Java中的时间以正确的方式(如在约达时间)?

+0

因此,您试图确定当年是否有52周或53周(已编号),我理解正确吗?对于美国或国际周编号,还是应该适用于两者? –

+0

由于根据ISO一周至少有四个日子属于哪一年,因此您可能会询问12月28日的周数。由于这一天只有三天,因此保证在最后一次编号一年中的一周。我承认有点棘手。同样,1月4日总是在第1周。 –

+0

请注意,如果您的代码在31天后的几个月内运行,您的代码才会有效!你需要交换两行'.withDayOfMonth(31)'和'.withMonth(12)'。 – steffen

回答

4

这些信息直接使用java.time.* API提供。

关键的方法是rangeRefinedBy(Temporal)TemporalField。它可以让你获得一个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基于星期的日历的工作方式,以及日历年和周一年之间的差异。

+0

这让我感到惊讶,我们现在拥有Java 8时间库的功能。 – YoYo

0

看来,当最后一天是第一周,你不想让1作为一个答案,但52/3/4,在这种情况下,你可能会寻找:

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

有几种定义周数的方法 - 如果没有做到你想要的,你需要澄清你想要使用的方法。

+1

尝试2012年,2013年,2014年和2015年:你应该得到53. – assylias

+0

对不起,在我的测试中的错误。那些年我得到53。 –

0

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

月,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 

这就是你实际做的。

+0

没有完全理解我在2010年到2020年尝试的问题。在2015年和2020年,我得到了53周。对于2010年,2011年,2016年和2017年,我得到了52份。我相信所有这些都是正确的。我的困惑是,在2012年,2013年,2014年,2018年和2019年,第一个片段产生53,第二个片段52 –

+0

@ OleV.V。你是对的 - 更新。 – steffen

+0

感谢您满足我的好奇心,我想我明白了现在的差异。 –

相关问题