我有一个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中完成这项工作?
答案 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 8601和week-of-year的first 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