【问题标题】:What settings in Mac OS X affect the `Locale` and `Calendar` inside Java?Mac OS X 中的哪些设置会影响 Java 中的“Locale”和“Calendar”?
【发布时间】:2014-07-19 21:08:40
【问题描述】:

这两个问题让我想知道 Mac OS X 中的哪些设置会影响 Java 中的 LocaleCalendar 默认值和行为:

这些讨论的关键是日历中的这两个属性:

在默认的美国运行时,在 Java 7 和 8 中,这两个值的默认值为 1。什么会导致报告其他值?

【问题讨论】:

    标签: java macos calendar dayofweek week-number


    【解决方案1】:

    我看到了一些影响 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 构造函数影响其属性。

    【讨论】:

    • 巴兹尔,你这么敬业,这么细致,简直吓人!我发现我的地区设置为英国 - 虽然我不知道这是怎么发生的! - 将其设置为 US 肯定会产生您发现的效果!
    • 我正在尝试将 java.util.Calendar 设置为 firstDayOfWeek=1,但没有运气。它总是=2 使用 Apple Java 1.6
    • @Sergey 永远不要使用糟糕的Calendar 类。由 java.time. 类取代。见WeekFields类。
    猜你喜欢
    • 2015-09-24
    • 1970-01-01
    • 2010-10-24
    • 2014-07-04
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    相关资源
    最近更新 更多