具有本地化的Java日期格式转换

时间:2017-11-29 23:09:10

标签: java simpledateformat datetime-format

我想将我的纪元时间转换为以下格式。

Tuesday, 29th of August, 12:30 PM

我正在尝试使用DateTimeFormatter

final DateTimeFormatter formatter = DateTimeFormatter
                .ofPattern("cccc, dd MMMM, hh:mm a")
                .withZone(ZoneId.of(timezone)).withLocale(locale);

现在,我如何在输出中获得'of'?这也是本地化的? 例如,在西班牙语中,我希望它为

martes, 29 de agosto, 12:30 PM.

1 个答案:

答案 0 :(得分:2)

如果要自动本地化日期时间格式语言和样式,请让DateTimeFormatter类通过调用ofLocalized…方法确定格式化程序。

要进行本地化,请指定:

  • FormatStyle确定字符串的长度或缩写。
  • Locale确定(a)翻译日期名称,月份名称等的人类语言,以及(b)决定缩写,大写,标点符号,分隔符等问题的文化规范

示例代码......

LocalDateTime ldt = LocalDateTime.of( 2017 , 8 , 29 , 12 , 30 );

Locale localeUS = Locale.US;
Locale localeCanadaFrench = Locale.CANADA_FRENCH;
Locale localeSpain = new Locale( "es" , "ES" );

DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM );

String outputUS = ldt.format( f.withLocale( localeUS ) );
String outputCanadaFrench = ldt.format( f.withLocale( localeCanadaFrench ) );
String outputSpain = ldt.format( f.withLocale( localeSpain ) );

转储到控制台。

System.out.println( "outputUS: " + outputUS );
System.out.println( "outputCanadaFrench: " + outputCanadaFrench );
System.out.println( "outputSpain: " + outputSpain );
  

outputUS:2017年8月29日,下午12:30:00

     

outputCanadaFrench:29août201712:30:00

     

outputSpain:29之前。 2017 12:30:00

对于LONGFULL的格式样式,您需要指定时区。

LocalDateTime ldt = LocalDateTime.of( 2017 , 8 , 29 , 12 , 30 );
ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = ldt.atZone( z );

Locale localeUS = Locale.US;
Locale localeCanadaFrench = Locale.CANADA_FRENCH;
Locale localeSpain = new Locale( "es" , "ES" );

DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL );

String outputUS = zdt.format( f.withLocale( localeUS ) );
String outputCanadaFrench = zdt.format( f.withLocale( localeCanadaFrench ) );
String outputSpain = zdt.format( f.withLocale( localeSpain ) );
  

outputUS:2017年8月29日星期二下午12:30:00新西兰标准时间

     

outputCanadaFrench:mardi29août2017à12:30:00 heure normale de la Nouvelle-Zélande

     

outputSpain:martes,29 de agosto de 2017,12:00:00(horaestándardeNueva Zelanda)

序号编号

我没有发现任何th(例如ndrdCell<T>等)出现在我见过的任何本地化中。< / p>

关于java.time

ordinal numbers框架内置于Java 8及更高版本中。这些类取代了麻烦的旧java.time日期时间类,例如legacyjava.util.Date和&amp; Calendar

现在位于SimpleDateFormatJoda-Time项目建议迁移到maintenance mode类。

要了解详情,请参阅java.time。并搜索Stack Overflow以获取许多示例和解释。规范是Oracle Tutorial

从哪里获取java.time类?

How to use ThreeTenABP…项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如ThreeTen-ExtraIntervalYearWeekYearQuarter