对于Java应用程序,周数对最终用户很重要。但是由于某些原因,对于相同的日期和区域设置,我的机器和最终用户的周数不同。
我们都运行Windows 10 64bit和jre1.8.0_101
我创建了一个小程序来说明问题,它在两台机器之间产生不同的结果。
Calendar calUs = Calendar.getInstance(Locale.US);
String usToday = "this week US: \t\t\t" + calUs.get(Calendar.WEEK_OF_YEAR) + " (should be 35 on 24-8-2016)";
Calendar calDe = Calendar.getInstance(Locale.GERMAN);
String deToday = "this week DE: \t\t\t" + calDe.get(Calendar.WEEK_OF_YEAR) + " (should be 34 on 24-8-2016)";
Calendar calDef = Calendar.getInstance();
String defToday = "this week default default: \t" + calDef.get(Calendar.WEEK_OF_YEAR)
+ " (should be 34 on 24-8-2016)";
System.out.println("Default locale: " + Locale.getDefault() + "\t(should be nl_NL)");
System.out.println(usToday);
System.out.println(deToday);
System.out.println(defToday);
在我的机器上产生:
默认语言环境:nl_NL(应为nl_NL)
本周美国:35(2016年8月24日应为35)
本周DE:34(2016年8月24日应为34)
本周默认默认值:34(2016年8月24日应为34)
但是对于最终用户,我们看到了错误的结果:
默认语言环境:nl_NL(应为nl_NL)
本周美国:35(2016年8月24日应为35)
本周DE:35(2016年8月24日应为34)
本周默认默认值:35(2016年8月24日应为34)
我已经尝试更改Windows注册表中的第一天和第一周的设置,以尝试重现问题,但没有成功。在MS Outlook中,我们在两台计算机上获得正确的周数。这让我相信这个问题仅限于java。
我在这里缺少什么?
答案 0 :(得分:1)
我刚刚在同事的机器上查看了我的Joda时间测试程序,该程序可以正常工作。所以看起来我们将努力改变主程序以使用该库(并且一旦我们到达Java 8就可能切换到Time)
我建议在处理Java中的周数时,不要花太多时间让Calendar类合作。