无法使用区域设置将日期翻译为西班牙语("es_ES")

Uli*_*era 33 java locale date

我正在尝试做一个简单的日期格式,它确实很好用,它很容易,但问题是语言.我使用语言环境"es_ES"来获取"Miércoles"而不是"Wednesday",并对此进行排序,但我失败了.

这是我的代码:

SimpleDateFormat formato = 
    new SimpleDateFormat("EEEE d 'de' MMMM 'de' yyyy", new Locale("es_ES"));
String fecha = formato.format(new Date());
Run Code Online (Sandbox Code Playgroud)

fecha字符串的EXPECTED值为:

Miércoles4de Abril de 2012

但我仍然得到:

2012年4月4日星期三

我究竟做错了什么?

Aff*_*ffe 69

"es_ES"是一种语言+国家.您必须单独指定每个部分.

构造函数Locale是:

您希望new Locale("es", "ES");获得与es_ES一起使用的Locale.

但是,最好使用Locale.forLanguageTag("es-ES")格式良好的IETF BCP 47语言标记es-ES(-代替_),因为该方法可以返回缓存Locale,而不是总是创建一个新缓存.

  • @JoseSerodio 只有 5 个语言环境使用变体:`en_US_POSIX:英语(美国,计算机)`,`no_NO_NY:挪威语(挪威,尼诺斯克)`,`th_TH_TH_#u-nu-thai:泰语(泰国,TH)`, `ja_JP_JP_#u-ca-japanese:日语(日本,JP)`,`ca_ES_VALENCIA:加泰罗尼亚语(西班牙,瓦伦西亚语)` (2认同)

Bas*_*que 5

tl;博士

String output = 
    ZonedDateTime.now ( ZoneId.of ( "Europe/Madrid" ) )
    .format ( 
        DateTimeFormatter.ofLocalizedDate ( FormatStyle.FULL )
                         .withLocale ( new Locale ( "es" , "ES" ) ) 
    )
;
Run Code Online (Sandbox Code Playgroud)

martes 12 de julio de 2016

细节

接受的答案是Affe是正确的。您错误地构造了一个Locale对象。

时间

问答都使用旧的过时类,现在已被Java 8 及更高版本中内置的java.time框架所取代。这些类取代了旧的麻烦的日期时间类,例如java.util.Date. 请参阅Oracle 教程。多的java.time功能后移植到Java 6和7在ThreeTen-反向移植和在进一步适于到Android ThreeTenABP

这些类包括在DateTimeFormatter从日期时间值生成字符串时控制文本格式的 。您可以指定显式格式设置模式。但何必呢?让班级自动将格式本地化为特定的人类语言和文化规范Locale

例如,获取马德里地区时区的当前时刻。

ZoneId zoneId = ZoneId.of( "Europe/Madrid" );
ZonedDateTime zdt = ZonedDateTime.now( zoneId );
// example: 2016-07-12T01:43:09.231+02:00[Europe/Madrid] 
Run Code Online (Sandbox Code Playgroud)

实例化一个格式化程序以生成一个字符串来表示该日期时间值。通过FormatStyle(完整、长、中、短)指定文本的长度。

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate ( FormatStyle.FULL );
Run Code Online (Sandbox Code Playgroud)

应用 aLocale替代分配给格式化程序的 JVM当前默认值 Locale

Locale locale = new Locale ( "es" , "ES" );
formatter = formatter.withLocale ( locale );
Run Code Online (Sandbox Code Playgroud)

使用格式化程序生成一个 String 对象。

String output = zdt.format ( formatter );
// example: martes 12 de julio de 2016
Run Code Online (Sandbox Code Playgroud)

转储到控制台。

System.out.println ( "zdt: " + zdt + " with locale: " + locale + " | output: " + output );
Run Code Online (Sandbox Code Playgroud)

zdt: 2016-07-12T01:43:09.231+02:00[欧洲/马德里] 语言环境:es_ES | 输出: martes 12 de julio de 2016