Java日历问题,JDK 1.6.0.22

Õzb*_*bek 4 java windows calendar

获得一年中的一周我有一个问题.在我的机器上,JDK 1.6.0.22版本安装在另一台机器1.6.0.21上.两台机器都返回不同的结果:

(1.6.0.22)周是:1
(1.6.0.21)周是:52

对于此代码:

      try {
         Calendar current = new GregorianCalendar();
         DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
         Date d = df.parse("2010-12-28 19:04:38 GMT");
         current.setTime(d);
         int currentWeek = current.get(Calendar.WEEK_OF_YEAR);
         System.out.println("week is: "currentWeek);
      } catch (ParseException e) {
        e.printStackTrace();
      }
Run Code Online (Sandbox Code Playgroud)

为什么JDK 1.6.0.22会给出错误的结果?

Mic*_*rdt 9

API文档中的这段摘录解释了为什么会出现这种差异:

为WEEK_OF_YEAR字段计算的值范围为1到53. 一年的第1周是从getFirstDayOfWeek()开始的最早的七天时间段,该时间段至少包含该年的getMinimalDaysInFirstWeek()天.因此,它取决于getMinimalDaysInFirstWeek(),getFirstDayOfWeek()和1月1日星期几的值.

并从源代码Calendar:

firstDayOfWeek和minimalDaysInFirstWeek都依赖于语言环境.

因此,区域设置决定了这一点,而不是时区!显然,在某些地区,一年的第1周被认为是在去年开始的.试试这个:

    Calendar cal = new GregorianCalendar();
    System.out.println(Locale.getDefault());
    System.out.println(cal.getMinimalDaysInFirstWeek());
    System.out.println(cal.getFirstDayOfWeek());
Run Code Online (Sandbox Code Playgroud)

我打赌你要么在不同的语言环境中运行不同的版本,要么在这些版本之间更改语言环境数据.结果"1"甚至可能是更正确的结果,并且由于区域设置数据中的错误修复.