【问题标题】:SimpleDateFormat.getTimeInstance ignores 24-hour formatSimpleDateFormat.getTimeInstance 忽略 24 小时格式
【发布时间】:2013-04-05 13:55:39
【问题描述】:

在我的应用程序中,我可以选择暂停执行一段时间。我想显示执行将恢复的时间,包括秒数,并且我希望根据系统设置格式化时间字符串。这是我想出的代码:

long millis = getResumeTime();
String timeString;
timeString = SimpleDateFormat.getTimeInstance(SimpleDateFormat.MEDIUM).format(millis);

这确实会生成一个带秒数的格式化字符串,但它会返回 AM/PM 格式的时间,即使我在设置中设置了 24 小时时间格式。更有趣的是,系统托盘中的时间已使用 24 小时格式正确格式化。

我尝试像这样使用 DateFormat.getTimeFormat:

long millis = getResumeTime();
String timeString;
java.text.DateFormat df = android.text.format.DateFormat.getTimeFormat(this);
timeString = df.format(millis);

但生成的字符串不包含秒数,而且我看不到包含它们的方法。

我在 Android 4.2 模拟器上运行此代码。我在这里错过了什么吗? SimpleDateFormat 是否不知道 12/24 小时设置?如果不是,如何获取系统格式的时间字符串表示(包括小时、分钟和秒)?

【问题讨论】:

  • 没有。他们讨论日期格式。我对时间格式感兴趣。不幸的是,它们的工作方式并不总是相同。
  • 如果你用 getTimeFormat 代替 getDateFormat android.text.format.DateFormat.getTimeFormat(getApplicationContext()))?
  • getTimeFormat() 返回“00:16”。 getDateFormat() 返回“2013 年 4 月 13 日”。我需要“00:16”+ 秒。

标签: java android time time-format


【解决方案1】:

在 Android 5 到 6.0.1 中似乎存在一个错误,其中 DateFormat#getTimeInstance(int) 返回一个忽略 使用 24 小时格式 设置的 DateFormat。其他答案提到了此错误的各种解决方法。您可以关注https://code.google.com/p/android/issues/detail?id=181201 的问题。

【讨论】:

    【解决方案2】:

    更简单的解决方案是:

    String timeString = DateUtils.formatDateTime(getContext(), timeInMillis,
               DateUtils.FORMAT_SHOW_TIME);
    

    这可以正确处理 12/24 小时用户设置。

    【讨论】:

      【解决方案3】:
      String timestamp = (DateFormat.format("yyyy.MM.dd kk:mm:ss", new Date())).toString();
      

      用 kk 代替 hh。

      【讨论】:

        【解决方案4】:

        这很可能取决于您的系统所在的区域设置。如果您的系统在美国,它将默认为 12 小时而不是 24 小时。即

        long millis = new Date().getTime();
        String uk = SimpleDateFormat
                       .getTimeInstance(SimpleDateFormat.MEDIUM, Locale.UK)
                       .format(millis);
        String us = SimpleDateFormat
                       .getTimeInstance(SimpleDateFormat.MEDIUM, Locale.US)
                       .format(millis);
        System.out.println("UK: " + uk);
        System.out.println("US: " + us);
        

        会给你

        UK: 16:19:49
        US: 4:19:49 PM
        

        所以,也许您可​​以获取系统语言环境并在格式化程序中指定它。

        但是,如果您总是希望它采用 24 小时格式,那么我建议您在格式化程序中明确指定它。

        更新:由于您想根据设备规范获取时间格式,您可以使用系统的 Time_12_24 值并根据结果值确定您的格式。

        【讨论】:

        • “我建议您在格式化程序中明确指定它” - 这当然是一个选项,但我希望已经有一种方法可以自动执行 :)
        • 该建议仅在您想要 - 始终 - 显示 24 小时格式时使用。当然,您始终可以使用 JVM 的默认语言环境并让它“自动”确定显示格式。
        • 我不想总是显示 24 小时格式,但如果用户在其设备设置中选中了相应的复选框,我想显示 24 小时格式。其中包括用户拥有 Locale.US 的情况。因此,假设我有两种情况:(1)Locale.US 和 24 小时复选框未选中,(2)Locale.US 和 24 小时复选框已选中。在这两种情况下,SimpleDateFormat.getTimeInstance 都以 AM/PM 格式返回小时,忽略 24 小时系统设置。
        • 我更新了答案以包含系统 TIME_12_24 选项。也许您可以将该值与用户选择的语言环境结合使用来确定您的格式。
        【解决方案5】:

        您可能应该创建自己的格式模式。如果我没记错的话,您使用的模式是“HH:mm:ss.SSS”,以提供小时、分钟、秒和小数秒的三位精度。

        请参阅 SimpleDateFormat 的 API 参考文档。

        【讨论】:

          猜你喜欢
          • 2021-12-13
          • 2012-10-09
          • 1970-01-01
          • 2012-06-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-27
          相关资源
          最近更新 更多