我有一个一周的问题。 在我的机器上安装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给出了错误的结果?
API文档的摘录解释了为什么会出现这种差异:
为WEEK_OF_YEAR字段计算的值范围从1到53. 第1周是第一个从getFirstDayOfWeek()开始的七天期,该期间至少包含该年的getMinimalDaysInFirstWeek()天。 因此取决于getMinimalDaysInFirstWeek(),getFirstDayOfWeek()和1月1日这一周中的哪一天。
并从Calendar
的源代码:
firstDayOfWeek和minimalDaysInFirstWeek都是区域设置相关的。
所以这是决定这一点的地方,而不是时区! 显然,在某些地区,一年的第一周被认为是在去年开始的。 尝试运行这个:
Calendar cal = new GregorianCalendar(); System.out.println(Locale.getDefault()); System.out.println(cal.getMinimalDaysInFirstWeek()); System.out.println(cal.getFirstDayOfWeek());
我敢打赌,无论是在不同的语言环境中运行不同的版本,还是在这些版本之间更改了语言环境数据。 结果“1”甚至可能是更正确的,由于在语言环境数据错误修复。
不要使用JDK日期/时间类 – 请使用JODA时间 。