我看到了一些关于影响 java.util.Calendar 的这些属性的特殊行为。
结论
事实确定:
- 爪哇
Locale
是由Language在系统偏好设置中。
- 日历的两个属性不受通过 Mac 更改的 Java 区域设置的影响Language。相反,它们是通过选择一个来确定的Region在系统偏好设置中。
- 奇怪的是,可能是一个错误,手动选择一周的第一天系统偏好设置中的弹出菜单无法影响 Java 中的等效属性。作为选择的一部分影响 Mac 设置Region影响 Java,但手动选择弹出菜单则不会。
- 通过 Mac 设置 Java 区域设置Language设置不会影响日历的属性,但会将区域设置传递给日历的构造函数does影响其属性(明显矛盾)。
Details
运行此代码作为测试。
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
public class TestCalendar
{
public static void main( String[] args )
{
Locale locale = Locale.getDefault();
Calendar c = Calendar.getInstance();
c.setTime( new Date( new Long( 1293840000000l ) ) ); // First moment of the year 2011 in UTC.
System.out.println( "Locale: " + locale + " | FirstDayOfWeek: " + c.getFirstDayOfWeek() + " | MinimialDaysInFirstWeek: " + c.getMinimalDaysInFirstWeek() );
}
}
在 Mac OS X (Mavericks) 上托管的 Parallels 9 虚拟机中使用 Mac OS X 10.8.5 (Mountain Lion),并安装 Java 8 Update 11美国我在安装操作系统期间选择的区域设置System Preferences
> Language & Text
.
系统偏好设置 > 语言和文本 > 区域 > 一周的第一天
奇怪的是,变化First day of week
on the Region选项卡没有效果。 Java报告FirstDayOfWeek: 1
我是否将该弹出菜单设置为“星期日”或“星期一”。
Locale: en_US | FirstDayOfWeek: 1 | MinimialDaysInFirstWeek: 1
重新启动 NetBeans IDE 没有帮助。重新启动 Mac(虚拟机)没有帮助。
系统偏好设置 > 语言和文本 > 区域
On the Region选项卡,检查显示所有地区复选框以查看更多区域。选择French
> France
。立即运行 IDE。无需重新启动 IDE 或操作系统,甚至无需关闭系统偏好设置 window.
Locale: en_US | FirstDayOfWeek: 2 | MinimialDaysInFirstWeek: 4
两个帐户都很有趣。
- 现在我们知道了Region设置会影响这两个关键的日历设置,但Locale没有改变。价值
2
正如 FirstDayOfWeek 的意思Monday
,这对于法国(以及世界大部分地区)来说是正确的。
- 另一个问题很奇怪,也许是一个错误:一周的第一天当设置为较大区域更改的一部分时,弹出窗口似乎会影响 Java,但手动选择该弹出窗口不会影响相关的 Java 属性。
重置Region弹出返回到United States
恢复 Java 属性,这是一致且符合预期的:
Locale: en_US | FirstDayOfWeek: 1 | MinimialDaysInFirstWeek: 1
系统偏好设置 > 语言和文本 > 语言
On the Language选项卡、拖动Français
(法语)位于列表顶部,因此它出现在英语之前。
立即运行 IDE。
Locale: fr_FR | FirstDayOfWeek: 1 | MinimialDaysInFirstWeek: 1
再次,有趣。现在我们知道了JavaLocale由Mac决定Language环境。我们知道这对相关的日历属性没有影响。
所以你认为麦克Language决定 Java Locale,Java Locale 决定not影响日历属性?阅读上面内容时是正确的,但是阅读下一节时错误,我们看到 Java Locale 设置了另一种方式can影响日历属性。很混乱。
传递 Java 区域设置
又发现一个矛盾。让我们将 Mac 恢复为美国默认设置: (1) 英文位于顶部Language列表,(2) 区域设置为美国.
更改我们的代码以将区域设置传递给日历的构造函数。
Calendar c = Calendar.getInstance( Locale.FRANCE );
这会影响日历属性:
FirstDayOfWeek: 2 | MinimialDaysInFirstWeek: 4
所以,令人困惑的矛盾是:
- 通过 Mac 设置 Java 区域设置Language does not影响日历的属性。
- 将区域设置显式传递给日历构造函数does影响其属性。