我看到了一些影响 java.util.Calendar 属性的特殊行为。
结论
确定的事实:
- Java
Locale 由系统偏好设置中的语言确定。
- Calendar 的两个属性不受通过 Mac 的 Language 更改的 Java 区域设置的影响。相反,它们是通过在系统偏好设置中选择一个区域来确定的。
- 奇怪的是,可能是一个错误,在系统偏好设置中手动选择一周的第一天弹出菜单无法影响 Java 中的等效属性。在选择 Region 时影响 Mac 设置会影响 Java,但手动选择弹出菜单不会。
- 通过 Mac Language 设置设置 Java 区域设置不会影响日历的属性,但将区域设置传递给日历的构造函数会影响其属性(明显矛盾) .
详情
将此代码作为测试运行。
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。
系统偏好设置 > 语言和文本 > 地区 > 一周的第一天
奇怪的是,在 Region 选项卡上更改 First day of week 没有任何效果。 Java 报告FirstDayOfWeek: 1 我是否将该弹出菜单设置为“星期日”或“星期一”。
Locale: en_US | FirstDayOfWeek: 1 | MinimialDaysInFirstWeek: 1
重新启动 NetBeans IDE 没有帮助。重新启动 Mac(虚拟机)没有帮助。
系统偏好设置 > 语言和文本 > 地区
在 区域 选项卡上,选中 显示所有区域 复选框以查看更多区域。选择French > France。立即运行 IDE。不需要重新启动 IDE 或操作系统,甚至不需要关闭 System Preferences 窗口。
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
系统偏好设置 > 语言和文本 > 语言
在语言选项卡上,将Français(法语)拖到列表顶部,使其显示在英语之前。
立即运行 IDE。
Locale: fr_FR | FirstDayOfWeek: 1 | MinimialDaysInFirstWeek: 1
再次,有趣。现在我们知道 Java Locale 是由 Mac Language 设置决定的。我们知道这对相关日历属性没有影响。
所以您认为 Mac 语言 决定了 Java 语言环境,而 Java 语言环境不 影响日历属性?正确,当阅读上面的内容时,但在阅读下一节时错误,我们看到 Java 语言环境设置了另一种方式可以影响日历属性。非常混乱。
传递 Java 语言环境
发现另一个矛盾。让我们将 Mac 恢复为美国默认设置:(1) Language 列表顶部的英语,(2) 区域设置为 United States。
更改我们的代码以将区域设置传递给日历的构造函数。
Calendar c = Calendar.getInstance( Locale.FRANCE );
这会影响日历属性:
FirstDayOfWeek: 2 | MinimialDaysInFirstWeek: 4
所以,令人困惑的矛盾是:
- 通过 Mac 的语言设置 Java 区域设置不会影响日历的属性。
- 将 Locale 显式传递给 Calendar 构造函数会影响其属性。