如何更改Java中的默认语言环境设置以使其一致?

4
我正在寻找一组命令行参数,以便为Java应用程序强制设置特定的区域设置。假设我无法修改该应用程序,因此必须使用“java -Dmy.prop =“value””设置属性。
我特别想要更改日期/时间格式,使其符合ISO-8601标准(军事时间),但我找不到适当的属性来实现这一点。

如果您拥有代码,可以在main()方法中简单地调用Locale.setDefault()。但我认为您正在攻击错误的问题。应用程序应该根据用户的语言环境格式化时间、数字和其他与文化相关的信息。如果没有这样做,应该解决这个问题。顺便说一下,有些类不支持本地化,因此它们将从toString()方法中打印不变的值。更改语言环境不会改变这种行为。 - Paweł Dyda
即使您无法修改应用程序,仍然可以创建一个启动器类,将默认设置为所需内容,然后调用应用程序的主类。 - Maurice Perry
3个回答

3

我怀疑解决这个问题的正确方法是提供一个新的Locale变体,例如en_US_mil

<language code>[_<country code>[_<variant code>]]

通过实现java.util.spijava.text.spi服务机制中的类,可以实现此操作。

此主题ICU网站上有提及。


2
推荐设置默认的Java区域设置方式是通过shell/操作系统区域设置。例如,在UNIX / LINUX上,默认区域设置是由环境变量确定的。
以下信息来自Java国际化FAQ
“我可以在应用程序之外设置默认语言环境吗?”这取决于您使用的Java平台的实现。初始默认区域设置通常从主机操作系统的区域设置确定。Sun的JRE 1.4及更高版本允许您通过从命令行设置user.language、user.country和user.variant系统属性来覆盖它。例如,要选择Locale("th","TH","TH")作为初始默认区域设置,您可以使用:
java -Duser.language=th-Duser.country=TH -Duser.variant=TH MainClass
由于并非所有运行时环境都提供此功能,因此应仅用于测试。
编辑:
问题问道:
我特别想要更改日期时间格式,使其符合ISO-8601标准(军事时间),但我找不到适当的属性来实现这一点。您似乎想要有选择地覆盖当前语言环境的某些方面,而不是完全更改它。简单的方法是让应用程序自己完成这项工作;即使用指定的日期格式而不是当前语言环境提供的默认格式。但如果应用程序是闭源的,则可能无法更改它。您可以尝试以下方法解决这个问题:
- 弄清楚Java如何将语言环境三元组(国家/语言/变体)解析为语言环境对象。 - 对于每种需要支持的语言环境,请子类化现有的语言环境类(等等),以实现使用ISO日期/时间格式的新变体。 - 创建一个包含自定义类或资源的JAR文件,并将其添加到类路径中。(您可能需要将JAR文件添加到引导类路径等才能使其正常工作) - 最后,如果应用程序没有使用语言环境机制来决定使用哪种日期格式,则基于更改语言环境进行的任何更改都将无效。

这仍然需要JVM支持locale:http://download.oracle.com/javase/6/docs/technotes/guides/intl/locale.doc.html#util-text - McDowell

1
很好,我对同样的事情感兴趣,但目前我只有一个部分解决方案
user.timezone=UTC
user.country=CA
user.variant=
user.language=en
file.encoding=utf8

你可以使用加拿大,因为它是使用 ISO 8601 格式的国家之一。


你写了“partial” - 这个问题的哪个部分它没有解决? - Thomas Mueller
它应该可以,但我在Hudson上尝试了一下,但并没有改变它。现在这取决于应用程序如何进行格式化,如果开发人员使用硬编码格式,则不能期望出现奇迹。 - sorin
2
Sbarnea - 更改JVM特定的file.encoding系统属性会导致未定义的行为:http://bugs.sun.com/view_bug.do?bug_id=4163515 - McDowell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接