但是,当我得到一年中的一周时,它错误地将一年中的一周返回为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]
答案 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周。
所有这些都说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
。