Joda-Time:获取特定年份的最大周数

问题描述 投票:8回答:3

如何使用Joda-Time获得特定年份的最大周数?

jodatime max week-number
3个回答
12
投票
new DateTime().withYear(PARTICULAR_YEAR).weekOfWeekyear().getMaximumValue();

@cody评论

.withWeekOfWeekyear().withWeekyear()两种方法的区别

new DateTime().withDate(2011, 1, 2);   

2/1/2011       : Sunday, last day of last week of 2010 (27/12/2010 - 2/1/2011)   
dayOfWeek      : 7
weekOfWeekyear : 52  
weekyear       : 2010

new DateTime().withDate(2011, 1, 3);

3/1/2011       : Monday, first day of first week of 2011 (3/1/2011 - 9/1/2011)
dayOfWeek      : 1
weekOfWeekyear : 1
weekyear       : 2011

4
投票

我知道回复一个问题这个旧的是一个坏死但是接受的答案(由lschin)有一个错误 - 虽然大多数时候它会返回正确的值,它有时会返回一个错误的,这取决于执行计算的时间。例如:

new DateTime().withYear(2014).weekOfWeekyear().getMaximumValue();

如果您在2014年12月28日运行上述内容,您将获得正确的值52.但是,在2014年12月29日的一天后运行的相同代码将返回53的值。这显然是一个问题因为给定的一年具有恒定的周数(更不​​用说您不希望您的方法仅在某些时间工作)。您可以通过更改系统日期或使用固定日期而不是new Date()来测试此项。

这里的问题是weekOfWeekyear(),如果new DateTime()恰好返回接近年终的日期,它可以增加给定的年份值。当当前和下一年都有相同的周数时,这不是问题,否则将是一个问题。因此,要纠正此问题,请使用:

new DateTime().withWeekYear(2014).weekOfWeekyear().getMaximumValue();
                   ^^^^

这将确保您在极少数情况下不会改变一年的增量并获得始终如一的正确结果。


0
投票

tl;dr

org.threeten.extra.YearWeek.of( 2018 , 1 ).is53WeekYear()

…要么…

org.threeten.extra.YearWeek.of( 2018 , 1 ).lengthOfYear()

java.time

Joda-Time项目现在在maintenance mode,团队建议迁移到java.time班。

Week?

你对周的定义是什么?第1周是否包含1月1日?或者第1周是否包含特定的星期几,例如星期日?第一周是第一周只包含新年的几天吗?其他一些定义?

ISO 8601

如果您的定义与ISO 8601标准一致,则表示第1周包含日历年的第一个星期四,星期一开始每周。所以今年有52或53周。日历的最后几天或前几天可能会在上一周/下周的基础上落地。

ThreeTen-Extra YearWeek class

对于标准周,请将ThreeTen-Extra库添加到项目中。这些类进一步增强了Java 8及更高版本中内置的java.time类的功能。

从您想要的基于周的年份数中获取一周。

YearWeek yw = YearWeek.of( 2018 , 1 ) ;

也许你想要当前的一周。

LocalDate ld = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;
YearWeek yw = YearWeek.from( ld ) ;

获得当年的周数,即52或53周。

int weeksCount = yw.lengthOfYear() ;

或者简单地询问那一年是否有53周。

boolean has53 = yw.is53WeekYear() ;

About java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.DateCalendarSimpleDateFormat

现在在Joda-Timemaintenance mode项目建议迁移到java.time班。

要了解更多信息,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规格是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。你可能会在这里找到一些有用的类,如IntervalYearWeekYearQuartermore

© www.soinside.com 2019 - 2024. All rights reserved.