【问题标题】:Best/recommended way to convert Java 8 OffsetDateTime to localized string on android将 Java 8 OffsetDateTime 转换为 android 上的本地化字符串的最佳/推荐方法
【发布时间】:2019-09-29 07:10:28
【问题描述】:

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

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

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

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

【问题讨论】:

  • 希望您了解 ThreeTenABP 为 Android 适配 ThreeTen-Backport
  • 是的,这是我正在使用的,但感谢您指出以供将来参考。

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


【解决方案1】:

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 ) ;

【讨论】:

  • 问题不是如何格式化,而是如何为用户Android系统规范格式化。我使用的DateFormat 来自Android,它获取应用程序上下文并返回一个DateFormat 可供使用。我不需要自己处理本地化。
  • @Erik 忘记DateFormat。我添加了一个关于如何询问区域和语言环境的系统默认值的部分。将其与 ofLocalized… 方法结合使用,以根据用户当前的默认设置进行完全本地化。请注意,如果格式很重要,您应该与用户确认区域和语言环境。任何线程中的任何应用程序中的任何代码都可以在运行时随时更改任一默认值,并立即更改代码的结果。
猜你喜欢
  • 1970-01-01
  • 2017-11-02
  • 2014-06-21
  • 2010-10-10
  • 2010-09-16
  • 2011-12-27
  • 2017-07-26
  • 1970-01-01
相关资源
最近更新 更多