Mac OS X中的哪些设置会影响Java中的`Locale`和`Calendar`?

Bas*_*que 5 java macos calendar dayofweek week-number

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

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

1当在默认美国上运行时,这两个值的默认值在Java 7和8中.什么可以导致报告其他值?

Bas*_*que 6

我已经看到了一些特殊的行为,这些行为会影响java.util.Calendar的这些属性.

结论

确定的事实:

  • Java Locale由" 系统偏好设置"中的" 语言"确定.
  • Calendar的两个属性不受通过Mac 语言更改的Java Locale的影响.相反,它们是通过在系统偏好设置中选择区域来确定的
  • 奇怪的是,可能是一个错误,手动选择系统偏好设置中的第一天的弹出菜单不会影响Java中的等效属性.影响Mac设置作为选择Region的一部分会影响Java,但手动选择弹出菜单则不会.
  • 通过Mac 语言设置设置Java Locale 不会影响Calendar的属性,但将Locale传递给Calendar的构造函数确实会影响其属性(这是一个明显的矛盾).

细节

将此代码作为测试运行.

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() );
    }
}
Run Code Online (Sandbox Code Playgroud)

在Mac OS X(Mavericks)上托管的Parallels 9虚拟机中使用Mac OS X 10.8.5(Mountain Lion),在安装操作系统期间选择了美国语言环境的Java 8 Update 11 ,我玩了System Preferences> Language & Text.

在Mac OS X Mountain Lion中选择Apple菜单>系统偏好设置>语言和文本后,窗口的屏幕截图

系统偏好设置>语言和文本>区域>一周的第一天

奇怪的是,更改First day of week" 区域"选项卡无效.Java报告FirstDayOfWeek: 1我是否将该弹出菜单设置为"星期日"或"星期一".

Locale: en_US | FirstDayOfWeek: 1 | MinimialDaysInFirstWeek: 1
Run Code Online (Sandbox Code Playgroud)

重新启动NetBeans IDE没有帮助.重新启动Mac(虚拟机)没有帮助.

系统偏好设置>语言和文字>区域

在" 区域"选项卡上,选中" 显示所有区域"复选框以查看更多区域.选择French> France.立即运行IDE.无需重启IDE或OS,甚至无需关闭" 系统偏好设置"窗口.

Locale: en_US | FirstDayOfWeek: 2 | MinimialDaysInFirstWeek: 4
Run Code Online (Sandbox Code Playgroud)

有趣的两个帐户.

  • 现在我们知道Region设置会影响这两个关键日历设置,但Locale没有改变.2作为FirstDayOfWeek 的价值意味着Monday,正如法国(以及世界其他地方)一样.
  • 另一个问题是奇怪的,也许是一个错误:一周第一天弹出窗口似乎影响Java,当设置为更大的区域更改的一部分但手动选择该弹出窗口不会影响有问题的Java属性.

重置Region弹出窗口以United States恢复Java属性,这是一致的和预期的:

Locale: en_US | FirstDayOfWeek: 1 | MinimialDaysInFirstWeek: 1
Run Code Online (Sandbox Code Playgroud)

系统偏好设置>语言和文字>语言

在" 语言"选项卡上,将Français(法语)拖动到列表顶部,使其显示在英语之前.

立即运行IDE.

Locale: fr_FR | FirstDayOfWeek: 1 | MinimialDaysInFirstWeek: 1
Run Code Online (Sandbox Code Playgroud)

再次,有趣.现在我们知道Java 语言环境是由Mac 语言设置决定的.我们知道这对日历属性没有影响.

所以你认为Mac的语言决定了Java的语言环境和Java语言环境并没有影响日历属性?是的,当阅读上面的内容时,但是在阅读下一节时我们看到Java Locale设置另一种方式可能会影响Calendar属性.很混乱.

传递Java语言环境

发现了另一个矛盾.让我们将Mac还原为美国默认值:(1)英语在语言列表顶部,(2)区域设置为美国.

更改我们的代码以将Locale传递给Calendar的构造函数.

Calendar c = Calendar.getInstance( Locale.FRANCE );
Run Code Online (Sandbox Code Playgroud)

这会影响日历属性:

FirstDayOfWeek: 2 | MinimialDaysInFirstWeek: 4
Run Code Online (Sandbox Code Playgroud)

所以,令人困惑的矛盾是:

  • 通过Mac的设置Java语言环境语言不会影响日历的属性.
  • 将Locale显式传递给Calendar构造函数确实会影响其属性.