在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