了解java.util.Calendar WEEK_OF_YEAR

我想了解如何java.util.Calendar.get(java.util.Calendar.WEEK_OF_YEAR)作品,但似乎我缺less一些观点。

 String time = "1998-12-31"; // year month day java.util.Calendar date = java.util.Calendar.getInstance(); date.setTime((new java.text.SimpleDateFormat("yyyy-MM-dd")).parse(time)); System.err.println("Week of year = " + date.get(java.util.Calendar.WEEK_OF_YEAR)); // Week of year = 1 Why ??? 

为什么date.get(java.util.Calendar.WEEK_OF_YEAR)在一年的最后一周返回1?

此外, "1998-01-01" WEEK_OF_YEAR是1, "1998-12-23"是52。
有人对这种行为有解释吗?

来自java.util.Calendar javadoc :

第一周

日历使用两个参数定义特定于区域的特定七天:一周的第一天和第一周的最小date(从1到7)。 这些数字是从构build日历时的语言环境资源数据中获取的。 它们也可以通过设置其值的方法明确指定。

设置或获取WEEK_OF_MONTH或WEEK_OF_YEAR字段时,日历必须确定月份或年份的第一周作为参考点。 一个月或一年的第一周定义为从getFirstDayOfWeek()开始的最早的七天期间,并且该月份或年份至less包含getMinimalDaysInFirstWeek()天。 在第一周之前,编号为…,-1,0的周; 编号2,3,…跟随它。 请注意,get()返回的规范化编号可能不同。 例如,特定的日历子类可以指定一年中的第1周之前一周作为上一年的第n周。

所以它是语言环境特定的。 在你的情况下,如果这个星期包含来自新的一年的日子,则从新的一年计算为第一周。

您可以使用日历#setMinimalDaysInFirstWeek(int)更改此行为。

npe的答案是正确的。

这是关于标准周的更多信息。

标准周

定义一年的第一周有很多方法。

但是,有一个主要的标准定义: ISO 8601标准 。 该标准定义了一年中的几周 ,包括一年中的第一周 。

这是今年第一个星期四的一周

标准星期从星期一开始,星期日结束。

乔达时间

卓越的Joda-Time框架默认使用ISO 8601。 其课程包括本周的信息。 Joda-Time是与Java捆绑的臭名昭着的java.util.Date&java.util.Calendar类的stream行替代品。

示例代码

下面是一些示例代码,用于获取当前date时间的第一周的第一天的第一个时刻。

注意与withTimeAtStartOfDay的呼叫,以获得一天中的第一个时刻。

 DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" ); DateTime now = new DateTime( timeZone ); DateTime firstWeekStart = now.withWeekOfWeekyear(1).withDayOfWeek(1).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 ); 

当运行…

 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 firstWeek: 2013-12-30T00:00:00.000+01:00/2014-01-06T00:00:00.000+01:00