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