SimpleDateFormat.getTimeInstance忽略24小时格式

时间:2013-04-12 21:57:12

标签: java android time time-format

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

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小时设置吗?如果没有,我如何以系统格式获得时间(包括小时,分钟和秒)的字符串表示?

5 个答案:

答案 0 :(得分:6)

更简单的解决方案是:

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:2)

它很可能取决于您的系统所在的区域设置。如果您的系统位于美国,则默认为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值并根据结果值确定格式。

答案 3 :(得分:1)

String timestamp = (DateFormat.format("yyyy.MM.dd kk:mm:ss", new Date())).toString();

而不是......,使用kk。

答案 4 :(得分:0)

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

请参阅SimpleDateFormat的API参考文档。