【发布时间】:2011-06-08 18:54:25
【问题描述】:
如何使用Joda-Time 获得特定年份的最大周数?
【问题讨论】:
-
JDK 日历为此提供:getActualMaximum(Calendar.WEEK_OF_YEAR)
标签: jodatime max week-number
如何使用Joda-Time 获得特定年份的最大周数?
【问题讨论】:
标签: jodatime max week-number
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
【讨论】:
我知道回答这么老的问题是一种死灵法,但接受的答案(由 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();
^^^^
这将确保您不会在这些罕见的情况下更改一年的增量并获得始终如一的正确结果。
【讨论】:
new DateTime().withWeekyear(2014).weekOfWeekyear().getMaximumValue(); 注意withWeekyear; y 是小写的。
org.threeten.extra.YearWeek.of( 2018 , 1 ).is53WeekYear()
……或者……
org.threeten.extra.YearWeek.of( 2018 , 1 ).lengthOfYear()
Joda-Time 项目现在位于maintenance mode,团队建议迁移到java.time 类。
你对周的定义是什么?第 1 周是否包含 1 月 1 日?或者第 1 周是否包含特定的星期几,例如星期日?第 1 周是仅包含新年的第一周吗?其他定义?
如果您的定义符合ISO 8601 标准,则意味着第 1 周包含日历年的第一个星期四,每周星期一开始。所以一年有 52 周或 53 周。日历的最后几天或前几天可能会出现在基于上一周/下一周的年份。
YearWeek 类对于标准周,将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() ;
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。
【讨论】: