gpt4 book ai didi

java - 如何以这种格式转换秒数 "HH:mm:ss"

转载 作者:IT老高 更新时间:2023-10-28 21:14:42 25 4
gpt4 key购买 nike

我想以这种格式“HH:mm:ss”转换秒/毫秒(对于 esamples,从 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”。我哪里错了?

最佳答案

时区。

长值 5000 表示 epoch 后 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 是您想要的更好的 model,因为它代表一定的秒数,而不是一天中的时间。但是格式化为 hh:mm:ss 很痛苦,所以如果您总是处理低于 24 小时的值,TimeOfDay 会免费为您提供这种格式,并且在其他方​​面是等效的。)


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

这是在我的机器上演示问题的 Scala REPL session 和 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

所以你可以看到我的默认时区是 GB,它与 5000L 表示的时间的 GMT 有 1 小时的偏移。将时区设置为 GMT 会得到 00:00:05 的预期输出。

关于java - 如何以这种格式转换秒数 "HH:mm:ss",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9214786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com