我有一个问题,即获得一年中的一周。在我的机器上,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会给出错误的结果?
答案 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。