Java 语言环境和日期格式

Posted

技术标签:

【中文标题】Java 语言环境和日期格式【英文标题】:Java Locale and date format 【发布时间】:2013-11-26 18:19:26 【问题描述】:

我只是不明白。有一个网站只支持英语和德语。并且用户可以选择指定他的国家/地区,以便日期、数字和其他特定于区域设置的数据以适当的格式显示。

语言环境构建为Locale locale = new Locale(lang, country)。日期格式如下:

DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
System.out.println("Date " + df.format(calendar.getTime()));

今天是26 Nov 2013,以下是人们看到的内容,具体取决于他们的国家和选择的语言:

    11/26/13 看到一个来自美国的人在看英文页面,语言环境 en_US,好的。 26/11/13 看到一个来自英国的人在看英文页面,语言环境 en_GB,好的。 11/26/13 看到一个来自法国的人在看英文页面,语言环境 en_FR错误

后者应该看到26/11/13(这里的法国人同意我的观点),因为日期格式是特定于国家/地区的,不是吗?我在这里错过了什么?

更新 问题很简单:为什么 Locale("en", "FR") 会产生错误的日​​期格式?

更新 2 如果有人能解释(作为答案的一部分)为什么 Java 在日期格式方面不考虑国家/地区,我将不胜感激,这(在我的 POV 中)纯粹是特定于国家/地区的。

【问题讨论】:

你的问题很不清楚。我现在已经读过很多遍了,但我仍然不能 100% 确定你在做什么。您是否阅读过您正在使用的方法的文档? en_FR 可能表示用户是居住在法国的美国人。 @Izmaki,我确定我已经阅读了所有内容。语言是英语,国家是法国,在这种情况下,您希望采用什么日期格式?我得到的是错误的。 @Osw - 基于this,声音en_FR 将故障回复到en_US “错误”取决于编写规范的人。在这种情况下,Apple 说它是对的。 @HotLicks - 它实际上是 Java;这与苹果无关。 【参考方案1】:

英语在法国不是官方语言,因此在任何 JVM 中都没有针对法国英语的特定设置。结果,您的语言环境更改回英语(en,默认实现为en_US)。 Here你可以找到完整的解释。

Here 你可以找到 JDK 7 和 JRE 7 支持的所有语言环境,但没有 en_FR 一个。

更新 2 如果有人能解释(作为回答的一部分)为什么 Java 在日期格式方面不考虑国家/地区,我将不胜感激,其中(在我的 POV 中)纯粹是针对特定国家/地区的。

日期格式可能是特定于国家/地区的,但您正在创建Locale 预定义的对象(不是动态创建的)。如果 JVM 没有实现语言环境 en_FR,那么它不能返回 Locale,这是部分英语-部分法语的混合。它只是返回一些指定的对象——最接近的是en。这就是它的实施方式。如果它返回 fr 一个,那么用户可能会感到一点不舒服,因为他想以某种 English 方言显示页面。

【讨论】:

仍然不明白为什么纯粹的国家/地区部分语言环境需要回退到英语。 @Osw JVM 尝试使用在法国使用的英语方言。如果没有这样的方言 (Locale) - 它使用 en Locale (默认情况下)扩展为 en_US【参考方案2】:

用于查找特定于语言环境的对象的LocaleServiceProviderPool 最终使用java.util.Locale#equals 来确定它是否有匹配项。它不区分“只关心语言”或“只关心国家”的功能。法国没有为英语预先定义任何内容,因此它恢复为默认值。

【讨论】:

我绝对看到了法国英语的一个预定义的东西 - 短日期格式。当然,如果语言在 Java 中表示语言,而国家则表示国家)) 嗯,你在找什么版本的 JDK?和你的部署环境一样吗? 1.6.0_26 中肯定没有任何东西,这是我目前碰巧安装的。 Java(TM) SE 运行时环境(构建 1.7.0_45-b18)如果重要的话 糟糕,抱歉,java.util.Locale#equals 引起了我的注意,加上“预定义”这个词,它现在对我来说终于有意义了。您是第一个回答的,但如果您不介意,我接受 Maciej 的回答))

以上是关于Java 语言环境和日期格式的主要内容,如果未能解决你的问题,请参考以下文章

Java常用日期时间格式化转换符

如何使日期与语言环境无关?

以用户的语言环境格式和时间偏移显示日期/时间

时刻 vs date-fns 语言环境日期格式

如何从日期选择器设置语言环境格式?

C++ - 如何以独立于平台、线程安全的方式以用户首选的日期/时间语言环境格式格式化文件的最后修改日期和时间