Java日历问题,JDK 1.6.0.22

时间:2010-12-28 19:56:21

标签: windows calendar java

我有一个问题,即获得一年中的一周。在我的机器上,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();
      }

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

2 个答案:

答案 0 :(得分:9)

此摘录from the API documentation解释了为何会出现这种差异:

  

为WEEK_OF_YEAR计算的值   字段范围从1到53. 第1周为a   年是最早的七天   从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());

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

答案 1 :(得分:1)

不要使用JDK日期/时间类 - 请改用JODA Time