-2

通过以下方式,我将日期对象设置为日历实例。 在此处输入图像描述

但是当我得到一年中的一周时,它错误地将一年中的一周返回为 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]
4

1 回答 1

5

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

它没有很好的记录,但事实证明一个月中的一周在一个月之后,所以在 12 月 31 日,它会为您提供 12 月的周数。由于 12 月 1 日和 2 日是周五和周六,因此它们形成了 12 月的第 1 周。第 2 周从 12 月 3 日开始。所以第 6 周从 12 月 31 日开始,只持续了那一天。这解释了为什么在您的情况下每月的第 6 周是第 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 日开始。然后第一个十二月的三天在第 0 周。

更喜欢使用 java.time

综上所述,该Calendar课程早已过时且设计不佳。我建议您改用java.time现代 Java 日期和时间 API。具体来说,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 教程:日期时间解释如何使用java.time.

于 2018-04-19T13:11:40.070 回答