无法使用区域设置将日期翻译为西class牙语(“es_ES”)
我正在尝试做一个简单的日期格式,它确实很好用,它很容易,但问题是语言。 我使用语言环境“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());
fecha
字符串的EXPECTED值为:
Miércoles4de Abril de 2012
但我仍然得到:
2012年4月4日星期三
我究竟做错了什么?
“es_ES”是一种语言+国家。 您必须单独指定每个部分。
Locale
的构造函数是:
- 区域设置(String语言)
从语言代码构造语言环境。 - Locale(String language,String country)
从语言,国家/地区构建语言环境。 - Locale(String language,String country,String variant)
根据语言,国家/地区,变体构建语言环境。
你想要new Locale("es", "ES");
获取与es_ES一起使用的Locale。
但是,最好使用Locale.forLanguageTag("es-ES")
,使用格式良好的IETF BCP 47语言标记es-ES
(使用-
而不是_
),因为该方法可以返回缓存的Locale
,而不是永远创造一个新的。
Java 8
LocalDate today = LocalDate.now(); String day = today.getDayOfWeek().getDisplayName(TextStyle.FULL, new Locale("es","ES")));
也适用于一个月。
TL;博士
String output = ZonedDateTime.now ( ZoneId.of ( "Europe/Madrid" ) ) .format ( DateTimeFormatter.ofLocalizedDate ( FormatStyle.FULL ) .withLocale ( new Locale ( "es" , "ES" ) ) ) ;
martes 12 de julio de 2016
细节
Affe 接受的答案是正确的。 您错误地构造了Locale
对象。
java.time
问题和答案都使用现在由Java 8及更高版本内置的java.time框架取代的旧的过时类。 这些类取代了旧的麻烦的日期时间类,如java.util.Date
。 请参阅Oracle教程 。 大部分java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7,并进一步适应了ThreeTenABP中的 Android。
这些类包括DateTimeFormatter
用于在从日期时间值生成String时控制文本的格式。 您可以指定显式格式设置模式。 但为什么要这么麻烦? 让类自动将格式本地化为特定Locale
的人类语言和文化规范。
例如,获取马德里区域时区的当前时刻。
ZoneId zoneId = ZoneId.of( "Europe/Madrid" ); ZonedDateTime zdt = ZonedDateTime.now( zoneId ); // example: 2016-07-12T01:43:09.231+02:00[Europe/Madrid]
实例化格式化程序以生成表示该日期时间值的String。 通过FormatStyle
指定文本的长度(完整,长,中,短)。
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate ( FormatStyle.FULL );
应用Locale
替换分配给formatter的JVM 当前默认 Locale
。
Locale locale = new Locale ( "es" , "ES" ); formatter = formatter.withLocale ( locale );
使用formatter生成String对象。
String output = zdt.format ( formatter ); // example: martes 12 de julio de 2016
转储到控制台。
System.out.println ( "zdt: " + zdt + " with locale: " + locale + " | output: " + output );
zdt:2016-07-12T01:43:09.231 + 02:00 [欧洲/马德里]与地区:es_ES | 输出:martes 12 de julio de 2016
Locale esLocale = new Locale("es", "ES");//para trabajar en español SimpleDateFormat formatter = new SimpleDateFormat(strFormatoEntrada, esLocale);//El formato con que llega mi strFecha más el lenguaje