如何转换此格式的秒“HH:mm:ss”
我想以这种格式转换秒/毫秒“HH:mm:ss”(对于采样,从5秒到00:00:05)。我试图以这种方式获得这种格式:
int millis = 5000;
SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
String time = df.format(millis);
这样,我得到的是“01:00:05”,而不是“00:00:05”。我错在哪里?
我想以这种格式转换秒/毫秒“HH:mm:ss”(对于采样,从5秒到00:00:05)。我试图以这种方式获得这种格式:
int millis = 5000;
SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
String time = df.format(millis);
这样,我得到的是“01:00:05”,而不是“00:00:05”。我错在哪里?
时区。
长整型值表示纪元后 5 秒。对于大多数时区,纪元后 5 秒不是当地时间午夜后 5 秒。5000
Java 8 更新:
java.time.LocalTime
将处理挂钟“一天中的时间”的想法,而不必担心中隐含的时区和日期。如果您可以使用 Java 8,并且持续时间将始终小于一天,那么您的示例的正确版本可以像以下内容一样简单:java.util.Date
int millis = 5000;
int seconds = millis / 1000; // Maybe no need to divide if the input is in seconds
LocalTime timeOfDay = LocalTime.ofSecondOfDay(seconds);
String time = timeOfDay.toString();
(我想严格来说,是你想要的更好的模型,因为它代表一定的秒数,而不是一天中的时间。但是格式化为hh:mm:ss是一件痛苦的事情,所以如果你总是处理低于24小时的值,TimeOfDay会免费为你提供这种格式,否则是等效的。java.time.Duration
如果您坚持使用 Java 7 或更低版本,那么在示例代码中显式指定 时区应该会为您提供所需的输出。GMT
下面是一个 Scala REPL 会话,演示了我的机器上的问题和 Java 7 解决方案:
scala> val millis = 5000
millis: Int = 5000
scala> val df = new java.text.SimpleDateFormat("HH:mm:ss")
df: java.text.SimpleDateFormat = java.text.SimpleDateFormat@8140d380
scala> df.format(millis)
res0: java.lang.String = 01:00:05
scala> df.getTimeZone.getID
res1: java.lang.String = GB
scala> df.getTimeZone.getOffset(millis)
res2: Int = 3600000
scala> df.setTimeZone(java.util.TimeZone.getTimeZone("GMT"))
scala> df.format(millis)
res3: java.lang.String = 00:00:05
因此,您可以看到我的默认时区是 ,在用 表示的时间与 GMT 偏移量为 1 小时。将时区设置为 GMT 将达到 的预期输出。GB
5000L
00:00:05
我为此任务编写了一个简单的实用程序函数,它不需要任何Java版本,也不需要实例化任何不必要的对象:
/**
* provides a String representation of the given time
* @return {@code millis} in hh:mm:ss format
*/
public static final String formatTime(long millis) {
long secs = millis / 1000;
return String.format("%02d:%02d:%02d", secs / 3600, (secs % 3600) / 60, secs % 60);
}
与这里的其他一些解决方案不同,这甚至可以处理长达100个小时