无法使用区域设置将日期翻译为西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