如何以这种格式“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”。我哪里错了?

原文由 Webman 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
1 个回答

时区。

长值 5000 表示纪元后 5 秒。对于大多数时区,纪元后 5 秒不是当地时间午夜后 5 秒。

Java 8 更新

java.time.LocalTime 将处理挂钟“一天中的时间”的想法,而您不必担心 java.util.Date 中隐含的时区和日期。如果您可以使用 Java 8,并且您的持续时间总是少于一天,那么您的示例的正确版本可以很简单:

 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();

(我想严格来说, java.time.Duration 是你想要的更好的 _模型_,因为它代表一定的秒数,而不是一天中的时间。但是格式化成 hh 很痛苦: mm:ss,所以如果您总是处理 24 小时以内的值,TimeOfDay 会免费为您提供这种格式,并且在其他方面是等效的。)


如果您坚持使用 Java 7 或更低版本,那么在您的示例代码中明确指定 GMT 的时区应该会给您预期的输出。

这是在我的机器上演示问题和 Java 7 解决方案的 Scala REPL 会话:

 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

所以你可以看到我的默认时区是 GB ,在 5000L 表示的时间与格林威治标准时间有 1 小时的偏差。将时区设置为 GMT 会产生 00:00:05 的预期输出。

原文由 Andrzej Doyle 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题