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

时间:2013-02-18 10:33:50

标签: java datetime jodatime

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

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

那是:

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

当我尝试使用Joda Time时:

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

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

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

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

2 个答案:

答案 0 :(得分:8)

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

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

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

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

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

顺便说一句,评论中的解决方法将无法一致地工作,特别是当系统时间与一年中的年份不同时,它将失败。

答案 1 :(得分:2)

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

如果您确实想要遵循ISO 8601week-of-yearfirst week标准定义,请参阅以下使用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