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

时间:2012-04-04 20:51:26

标签: java date locale

我正在尝试做一个简单的日期格式,它确实很好用,很容易,但问题是语言。我使用语言环境“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日星期三

我做错了什么?

5 个答案:

答案 0 :(得分:63)

“es_ES”是一种语言+国家/地区。您必须单独指定每个部分。

Locale的构造函数是:

您希望new Locale("es", "ES");获取与es_ES一起使用的区域设置。

但是,最好使用格式正确的IETF BCP 47语言标记es-ES-代替_)来使用Locale.forLanguageTag("es-ES"),因为方法可以返回缓存的Locale,而不是始终创建新的。{/ p>

答案 1 :(得分:4)

Java 8

LocalDate today = LocalDate.now();
String day = today.getDayOfWeek().getDisplayName(TextStyle.FULL, new Locale("es","ES")));

也适用于月份。

答案 2 :(得分:3)

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的accepted Answer是正确的。您错误地构造了Locale对象。

java.time

问题和答案都使用现在由Java 8及更高版本内置的java.time框架取代的旧的过时类。这些类取代了旧的麻烦的日期时间类,如java.util.Date。见Oracle Tutorial。许多java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并在ThreeTenABP中进一步适应Android。

这些类包括DateTimeFormatter,用于在从日期时间值生成字符串时控制文本格式。您可以指定显式格式设置模式。但为什么要这么麻烦?让课程自动将格式本地化为特定Locale的人类语言和文化规范。

例如,获取Madrid regional time zone中的当前时刻。

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应用于substitute for分配给格式化程序的JVM current default Locale

Locale locale = new Locale ( "es" , "ES" );
formatter = formatter.withLocale ( locale );

使用格式化程序生成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

答案 3 :(得分:1)

    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

答案 4 :(得分:1)

Locale spanishLocale=new Locale("es", "ES");
    String dateInSpanish=localDate.format(DateTimeFormatter.ofPattern("EEEE, dd MMMM, yyyy",spanishLocale));
    System.out.println("'2016-01-01' in Spanish: "+dateInSpanish);