在Joda Time获取一年中第一周的第一天的日期

我有一个Java日期:tempDate = Sun Jan 01 00:00:00 GMT + 01:00 2012。

我想创建一个新的日期,即tempDate年份第一周的第一天。

那是:

Mon Jan 02 00:00:00 GMT+01:00 2012 

当我尝试使用Joda时间时:

 DateTime cal = new DateTime(tempDate).withWeekOfWeekyear(1). withDayOfWeek(DateTimeConstants.MONDAY); 

我得到了我想要的,但在前一年:

 Mon Jan 03 00:00:00 GMT+01:00 2011 

我如何在Joda Time中完成这项工作?

您必须了解DateTime的年份与其周年之间的差异。

在Joda-Time ,根据ISO 8601标准 ,星期一是一周的第一天。 然而,岁月并不总是在星期一开始。 仍然根据ISO标准,一年的第一周是包含该年第一个星期四的一周。 因此,一年中的某些日子可能会落到上一年或下一年的一周。

在你的例子01/01/2012实际上是这样的一天。 它属于2011年第52周。所以它的一年(2012年)与其一周(2011年)不同。 因此,如果您将日期更改为其周年的第一周,您将在2011年的第一周获得日期时间。

为了使这项工作始终如一,您只需确保您的周年与您的年份相同:

 DateTime onTheFirstDayOfTheFirstWeek = dateTime.withWeekyear(dateTime.getYear()).withWeekOfWeekyear(1).withDayOfWeek(1); 

顺便说一下,你的评论中的解决方法将不能始终如一地工作,特别是当系统时间与一年中的年份不同时,它会失败。

bowmore的答案是正确的,回答了这个问题。

如果你确实想要遵循一年中和第一周的ISO 8601标准定义,这里有一些使用Joda-Time 2.3的示例代码。

请注意对withTimeAtStartOfDay的调用以获取当天的第一个时刻。 天不总是在00:00:00开始。

 DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" ); DateTime now = new DateTime( timeZone ); DateTime firstWeekStart = now.withWeekOfWeekyear(1).withDayOfWeek( DateTimeConstants.MONDAY ).withTimeAtStartOfDay(); DateTime firstWeekStop = firstWeekStart.plusWeeks( 1 ); Interval firstWeek = new Interval( firstWeekStart, firstWeekStop ); 

转储到控制台……

 System.out.println( "now: " + now ); System.out.println( "firstWeekStart: " + firstWeekStart ); System.out.println( "firstWeekStop: " + firstWeekStop ); System.out.println( "firstWeek: " + firstWeek ); firstWeek: 2013-12-30T00:00:00.000+01:00/2014-01-06T00:00:00.000+01:00 

跑的时候……

 now: 2014-02-07T12:49:33.623+01:00 firstWeekStart: 2013-12-30T00:00:00.000+01:00 firstWeekStop: 2014-01-06T00:00:00.000+01:00