在Java上将Java 8 OffsetDateTime转换为本地化字符串的最佳/推荐方法

时间:2019-05-11 19:07:30

标签: java android datetime java-8 date-formatting

我正在将我的Android应用转换为使用ThreeTen-Backport而不是旧版Java Date类来使用新的Java 8日期时间类。

根据用户的Android偏好设置格式化日期和时间以呈现给用户的最佳/推荐方式是什么?在使用Date类时,我这样使用DateFormat

DateFormat.getDateFormat(context).format(new Date()) // for date
DateFormat.getTimeFormat(context).format(new Date()) // for time

这些方法接收Date作为参数。我应该通过将OffsetDateTime转换为Date来继续使用它们吗,还是有更好的方法呢?

1 个答案:

答案 0 :(得分:3)

org.threeten.bp.format

忘记DateFormatDate。几年前,这些可怕的类被JSR 310所取代。

请参见org.threeten.bp.format软件包。

DateTimeFormatter

具体来说,请看DateTimeFormatter类及其ofLocalized…方法。

有关更多信息,请从 java.time 中搜索等效的类。格式已经被覆盖很多次了。 API和功能将几乎相同,因此现有文章将适用。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

Locale l = Locale.CANADA_FRENCH ; 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM ).withLocale( l ) ;
String output = zdt.format( f ) ;
  

2019年5月11日

使用默认值

如果您要使用JVM的当前默认值for the time zonefor the locale,建议您明确使用。这样,任何阅读您代码的人都知道您考虑了区域/区域问题,并有意识地选择使用默认值。

ZoneId z = ZoneId.systemDefault() ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

Locale l = Locale.getDefault() ; 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM ).withLocale( l ) ;
String output = zdt.format( f ) ;