43

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

Miércoles 4 de 四月 de 2012

但我仍然得到:

2012 年 4 月 4 日星期三

我究竟做错了什么?

4

5 回答 5

88

“es_ES”是一种语言+国家。您必须分别指定每个部分。

的构造函数Locale是:

您想new Locale("es", "ES");获得与 es_ES 一起使用的语言环境。

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

于 2012-04-04T20:56:16.170 回答
5

tl;博士

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

马尔特斯 2016 年 7 月 12 日

细节

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

java.time

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

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

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

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

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

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate ( FormatStyle.FULL );

应用 a替换Locale分配给格式化程序的 JVM当前默认值。 Locale

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

使用格式化程序生成一个字符串对象。

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

于 2016-07-11T23:30:45.057 回答
4

爪哇 8

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

也可以工作一个月。

于 2016-08-24T22:27:12.973 回答
2
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);
于 2019-11-12T14:45:08.833 回答
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
于 2016-08-17T03:03:16.557 回答