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

时间:2011-06-08 18:54:26

标签: jodatime max week-number

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

3 个答案:

答案 0 :(得分:12)

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

  

@cody Comment

     

两种方法的区别    .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

答案 1 :(得分: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();
                   ^^^^

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

答案 2 :(得分:0)

TL;博士

sqlCommand.Parameters.Add("@keyword", SqlDbType.VarChar, 1000);
sqlCommand.Parameters["@keyword"].Value = searchText;

...或...

sudo dnf install fedora-repos-rawhide -y
sudo dnf --disablerepo=* --enablerepo=rawhide --releasever=[next release #, e.g. if you're on 27 use 28] install [package name]

java.time

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

周?

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

ISO 8601

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

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

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

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

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

也许你想要当前的一周。

YearWeek

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

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

或者只是询问那一年是否有53周。

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

关于java.time

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

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

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

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore