SimpleDateFormat.getTimeInstance忽略24小时格式

Ant*_*hyn 6 java time android time-format

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

long millis = getResumeTime();
String timeString;
timeString = SimpleDateFormat.getTimeInstance(SimpleDateFormat.MEDIUM).format(millis);
Run Code Online (Sandbox Code Playgroud)

这确实产生了一个带有秒的格式化字符串,但它返回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);
Run Code Online (Sandbox Code Playgroud)

但结果字符串不包含秒,我没有看到包含它们的方法.

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

vov*_*888 6

更简单的解决方案是:

String timeString = DateUtils.formatDateTime(getContext(), timeInMillis,
           DateUtils.FORMAT_SHOW_TIME);
Run Code Online (Sandbox Code Playgroud)

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


s1m*_*m0n 5

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


dis*_*ake 2

这很大程度上取决于您的系统所在的区域设置。如果您的系统位于美国,则默认为 12 小时而不是 24 小时。IE

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);
Run Code Online (Sandbox Code Playgroud)

会给你

UK: 16:19:49
US: 4:19:49 PM
Run Code Online (Sandbox Code Playgroud)

因此,也许您可​​以获取系统区域设置并在格式化程序中指定它。

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

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

  • 我不想“始终”显示 24 小时格式,但如果用户在其设备设置中选中了相应的复选框,我想显示 24 小时格式。其中包括用户拥有 Locale.US 的情况。假设我有两种情况:(1)Locale.US 和 24 小时复选框未选中,(2)Locale.US 和 24 小时复选框已选中。在这两种情况下,SimpleDateFormat.getTimeInstance 都会以 AM/PM 格式返回小时,忽略 24 小时系统设置。 (3认同)