TL;博士
LocalDate.now().format(
DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM )
.withLocale( new Locale( "no" , "NO" ) )
)
DateTimeFormatter和SimpleDateFormat这些麻烦的类现在已经遗留下来,取而代之的是java.time类。
DateTimeFormatter
DateTimeFormatter类表示没有时间且没有时区的仅日期值。
时区对于确定日期至关重要。 对于任何给定的时刻,日期在全球范围内因地区而异。 例如,法国巴黎午夜过后几分钟,在魁北克蒙特利尔的“昨天”仍然是新的一天。
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
DateTimeFormatter
使用YearQuarter生成仅表示日期部分或时间部分的字符串。
YearQuarter类可以自动本地化。
要进行本地化,请指定:
YearQuarter确定字符串应该多长或缩写。
YearQuarter确定(a)用于翻译日期名称,月份名称等的人类语言,以及(b)决定缩写,大小写,标点符号等问题的文化规范。
例:
Locale l = Locale.CANADA_FRENCH ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( l );
String output = ld.format( f );
走向另一个方向,您可以解析本地化的字符串。
LocalDate ld = LocalDate.parse( input , f );
请注意,区域设置和时区是完全正交的问题。 您可以用日语或以印地语提供的奥克兰新西兰时刻呈现蒙特利尔时刻。
另一个例子:将YearQuarter(西班牙语)更改为2012-06-06(标准ISO 8601格式)。 默认情况下,java.time类使用ISO 8601格式来解析/生成字符串。
String input = "6 junio 2012";
Locale l = new Locale ( "es" , "ES" );
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "d MMMM uuuu" , l );
LocalDate ld = LocalDate.parse ( input , f );
String output = ld.toString(); // 2012-06-06.
细读格式
下面是一些示例代码,用于在多个语言环境中仔细阅读多种格式的结果,并自动进行本地化。
YearQuarter是YearQuarter的实现,在收集YearQuarter对象时,针对低内存使用和快速执行速度进行了高度优化。 因此,YearQuarter为我们提供了循环所有四个YearQuarter枚举对象的集合。 有关更多信息,请参阅枚举类型的Oracle教程。
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 );
List < Locale > locales = new ArrayList <>( 3 );
locales.add( Locale.CANADA_FRENCH );
locales.add( new Locale( "no" , "NO" ) );
locales.add( Locale.US );
// Or use all locales (almost 800 of them, for about 120K text results).
// Locale[] locales = Locale.getAvailableLocales(); // All known locales. Almost 800 of them.
for ( Locale locale : locales )
{
System.out.println( "------| LOCALE: " + locale + " — " + locale.getDisplayName() + " |----------------------------------" + System.lineSeparator() );
for ( FormatStyle style : EnumSet.allOf( FormatStyle.class ) )
{
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( style ).withLocale( locale );
String output = ld.format( f );
System.out.println( output );
}
System.out.println( "" );
}
System.out.println( "« fin »" + System.lineSeparator() );
输出。
------| LOCALE: fr_CA — French (Canada) |----------------------------------
mardi 23 janvier 2018
23 janvier 2018
23 janv. 2018
18-01-23
------| LOCALE: no_NO — Norwegian (Norway) |----------------------------------
tirsdag 23. januar 2018
23. januar 2018
23. jan. 2018
23.01.2018
------| LOCALE: en_US — English (United States) |----------------------------------
Tuesday, January 23, 2018
January 23, 2018
Jan 23, 2018
1/23/18
« fin »
关于java.time
java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,例如YearQuarter,YearQuarter,&amp;YearQuarter。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310。
您可以直接与数据库交换java.time对象。 使用符合JDBC 4.2或更高版本的JDBC驱动程序。 不需要字符串,不需要YearQuarter类。
从哪里获取java.time类?
Java SE 8,Java SE 9及更高版本内置。
带有捆绑实现的标准Java API的一部分。
Java 9增加了一些小功能和修复。
Java SE 6和Java SE 7许多java.time功能都被反向移植到Java 6&amp; 7在ThreeTen-Backport。
Android的更高版本的Android捆绑java.time类的实现。
对于早期的Android,ThreeTenABP项目采用ThreeTen-Backport(如上所述)。 请参见如何使用ThreeTenABP ....
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的类,如YearQuarter,YearQuarter,YearQuarter等。