为什么Java日历对象返回错误的WEEK_OF_YEAR和WEEK_OF_MONTH

时间:2018-04-19 12:54:42

标签: java week-number java.util.calendar java-date

通过以下方式我将日期对象设置为日历实例。 enter image description here

但是,当我得到一年中的一周时,它错误地将一年中的一周返回为1。 与一年中的一周相同,一周中的值也是错误的。它返回6.但它应该是5.

以下是日历实例值

的输出
java.util.GregorianCalendar[time=1514678400000, 
areFieldsSet=true, 
areAllFieldsSet=true, 
lenient=true, 
zone=sun.util.calendar.ZoneInfo[id="UTC", 
offset=0, dstSavings=0, useDaylight=false, transitions=0, lastRule=null], 
firstDayOfWeek=1, minimalDaysInFirstWeek=1, ERA=1, YEAR=2017, MONTH=11, WEEK_OF_YEAR=1, WEEK_OF_MONTH=6, DAY_OF_MONTH=31, DAY_OF_YEAR=365, DAY_OF_WEEK=1, DAY_OF_WEEK_IN_MONTH=5, AM_PM=0, HOUR=0, HOUR_OF_DAY=0, MINUTE=0, SECOND=0, MILLISECOND=0, ZONE_OFFSET=0, DST_OFFSET=0]

1 个答案:

答案 0 :(得分:3)

firstDayOfWeek=1表示星期日是一周的第一天。所以2017年12月31日星期日属于2018年第1周。

它没有很好的记录,但事实证明,月份之后的一周,因此在12月31日,它给出了12月份的周数。由于12月1日和2日是星期五和星期六,他们形成了12月的第1周。第2周开始于12月3日。因此第6周开始于12月31日,仅持续了那一天。这解释了为什么在你的情况下为什么月份为6周。

我们是否使用IST时区(我假设它意味着亚洲/加尔各答)或UTC没有任何区别。在印度的早上5:30,它是UTC的00:00,日期仍然是12月31日,因此周数也没有变化。

Calendar的第一周第一天和第一周最小日期的设置遵循美国和其他一些国家/地区使用的标准。如果你想要国际标准,其中星期一是一周的第一天,并且第一周至少有4天,你可以用一个使用国际标准的国家的语言环境来实例化它,例如:

    Calendar c = Calendar.getInstance(Locale.FRANCE);

在这种情况下,一年中的一周将是52,一周中的一周将是4.不是5.这是因为12月的前三天不足以形成一周,所以12月的第1周从12月4日开始。然后12月的前三天是在第0周。

更喜欢使用java.time

所有这些都说Calendar课程已经过时且设计不佳。我建议您使用现代Java日期和时间API java.time。具体而言,LocalDate& WeekFields课程。

例如:

    LocalDate date = LocalDate.of(2017, Month.DECEMBER, 31);
    System.out.println("ISO week of year  " + date.get(WeekFields.ISO.weekOfWeekBasedYear()));
    System.out.println("ISO week of month " + date.get(WeekFields.ISO.weekOfMonth()));
    System.out.println("US week of year   " + date.get(WeekFields.SUNDAY_START.weekOfWeekBasedYear()));
    System.out.println("US week of month  " + date.get(WeekFields.SUNDAY_START.weekOfMonth()));

输出:

ISO week of year  52
ISO week of month 4
US week of year   1
US week of month  6

结果与我们从Calendar获得的结果一致。

链接:Oracle tutorial: Date Time解释如何使用java.time