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 语言环境和日期格式的主要内容,如果未能解决你的问题,请参考以下文章