SimpleDateFormat.getTimeInstance忽略24小时格式。

7

在我的应用中,我有一个选项来暂停执行一段时间。我想要展示执行将会恢复的时间,包括秒,并且希望这个时间字符串按照系统设置进行格式化。以下是我编写的代码:

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小时制?如果不是,那么如何以系统格式获取时间的字符串表示形式(包括小时、分钟和秒)?


重复的问题?https://dev59.com/9mox5IYBdhLWcg3wYzbX - Andrew Lazarus
1
不是,他们讨论的是日期格式。我对时间格式感兴趣。不幸的是,它们并不总是以相同的方式工作。 - Anton Cherkashyn
如果您将 android.text.format.DateFormat.getTimeFormat(getApplicationContext())) 替换为 getTimeFormat,会发生什么? - Andrew Lazarus
getTimeFormat() 返回"00:16"。getDateFormat() 返回"4/13/2013"。我需要“00:16”加上秒数。 - Anton Cherkashyn
5个回答

7
更简单的解决方案是:
String timeString = DateUtils.formatDateTime(getContext(), timeInMillis,
           DateUtils.FORMAT_SHOW_TIME);

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


5
似乎在Android 5到6.0.1中存在一个bug,DateFormat#getTimeInstance(int)返回的DateFormat会忽略使用24小时格式设置。其他答案提供了多种解决方法来应对这个问题。你可以在https://code.google.com/p/android/issues/detail?id=181201上跟踪此问题。

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值,并从生成的值中确定格式。


1
"我建议你在格式化程序中明确指定它" - 当然,这是一个选择,但我希望已经有一个可用的方法可以自动完成 :) - Anton Cherkashyn
那个建议仅适用于您希望始终显示24小时格式的情况下。当然,您可以始终使用JVM的默认区域设置,并让它“自动”确定显示格式。 - dispake
3
我不想总是以24小时制显示时间,但如果用户在设备设置中选中了适当的复选框,则要以24小时制显示时间。这包括用户选择Locale.US的情况。假设我有两种情况:(1)Locale.US和24小时复选框未选中,(2)Locale.US和24小时复选框已选中。在这两种情况下,SimpleDateFormat.getTimeInstance仅返回AM / PM格式的小时,忽略24小时系统设置。 - Anton Cherkashyn
1
我更新了答案,包括系统TIME_12_24选项。也许你可以将该值与用户选择的语言环境结合使用,以确定你的格式。 - dispake

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

使用kk代替hh。


0

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

请参阅SimpleDateFormat的API参考文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接