java - 使用用户的区域设置时用秒格式化日期和时间

标签 java android datetime kotlin

我正在尝试显示日期和时间,包括根据用户的区域设置格式化的秒数。因此,如果一个 Action 发生在 2020 年 3 月 5 日 14:47:51,在美国它应该显示为 03/05/2020 14:47:51而在英国则为 05/03/2020 14:47:51 , 在波兰 05.03.2020, 14:47:51 , 在捷克 5.3.2020 14:47:51等等
我可以通过以下方式在几秒钟内显示它:

DateUtils.formatDateTime(
            context,
            event.time,
         DateUtils.FORMAT_24HOUR or DateUtils.FORMAT_SHOW_TIME or DateUtils.FORMAT_SHOW_YEAR or DateUtils.FORMAT_SHOW_DATE or DateUtils.FORMAT_NUMERIC_DATE
        )
但是没有常数来显示秒数。
请问有什么想法吗?

最佳答案

java.time

    DateTimeFormatter localizedFormatter = DateTimeFormatter
            .ofLocalizedDateTime(FormatStyle.SHORT, FormatStyle.MEDIUM);
    
    ZonedDateTime dateTime = ZonedDateTime
            .of(2020, 3, 5, 14, 47, 51, 123456789, ZoneId.systemDefault());
    
    System.out.println(dateTime.format(localizedFormatter));
我的桌面 Java 11 从 CLDR, the Unicode Common Locale Data Repository 获取其语言环境数据,默认使用 as of Java 9 。这些数据在所有情况下都不符合您的期望。不同语言环境的输出为:
en-US  3/5/20, 2:47:51 PM
en-GB  05/03/2020, 14:47:51
pl-PL  05.03.2020, 14:47:51
cs-CZ  05.03.20 14:47:51
在 Java 12 at IdeOne.com 上实时查看此运行。
但是,Android 上的输出可能会有所不同,如果您没有得到满意的结果,请自行查看。
两个参数 DateTimeFormatter.ofLocalizedDateTime() 一个参数用于日期样式,一个参数用于时间样式。每个都可以是短的、中的、长的或完整的。
问:java.time 不需要 Android API 26 级吗?
java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少 Java 6
  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 开始)中,现代 API 是内置的。
  • 在非 Android Java 6 和 7 中获得 ThreeTen Backport,现代类的后向端口(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在较旧的 Android 上,要么使用脱糖,要么使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。在后一种情况下,请确保从带有子包的 org.threeten.bp 导入日期和时间类。

  • 链接
  • Oracle tutorial: Date Time 解释如何使用 java.time。
  • Java Specification Request (JSR) 310 ,其中首次描述了 java.time
  • ThreeTen Backport projectjava.time 到 Java 6 和 7 的反向移植(JSR-310 的 ThreeTen)。
  • Java 8+ APIs available through desugaring
  • ThreeTenABP,安卓版 ThreeTen Backport
  • Question: How to use ThreeTenABP in Android Project ,有非常详尽的解释。
  • 关于java - 使用用户的区域设置时用秒格式化日期和时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63039870/

    相关文章:

    java - JPA/Hibernate继承没有id

    android - 最佳 android 虚拟设备设置(AVD 设置)

    javascript - 正则表达式无法验证 28 到 31 之间的日期

    python - python格式日期时间的问题

    java - 使用注解在 Spring Hibernate 中编写更少的 DAO

    java - 如何在 JFrame 上显示 JTable

    android - 异步任务 : doInbackground() not called with executeOnExecutor and execute

    Android Account Authenticator 编辑 Email Id Credentials

    datetime - 如何使用 Oracle 在日期和时间之间添加字母 "T"?

    java - 线程中的异常 "main"java.lang.ArrayIndexOutOfBoundsException : 0