您要格式化的是一个持续时间,而不是日期时间。
您有一个持续时间(经过的毫秒数),它与日期时间即时间轴上的瞬间不同。您使用SimpleDateFormat来格式化java.util.Date,它表示时间轴上的瞬间。可以通过以下示例更好地理解差异:
1.此计算机自2021-09-30'T'10:20:30以来一直在运行。
2.此计算机已运行3天4小时5分钟。
前者代表时间轴上的瞬间,而后者代表持续时间。
java.time
“java.util”日期时间API及其格式化API“SimpleDateFormat”已经过时且容易出错。建议完全停止使用它们并切换到
现代日期时间API*。
此外,以下是来自
Joda-Time首页的通知:
请注意,从Java SE 8开始,用户被要求迁移到java.time(JSR-310)——JDK的核心部分,用于替代该项目。
使用现代的日期时间API-java.time的解决方案:我建议您使用java.time.Duration
,它是基于ISO-8601标准建模的,并作为JSR-310实现的一部分在Java-8中引入。随着Java-9的推出,还引入了更多的便利方法。
演示:
import java.time.Duration;
public class Main {
public static void main(String[] args) {
long millis = 123456789L;
Duration duration = Duration.ofMillis(millis);
System.out.println(duration);
String formattedElapsedTime = String.format("%2d:%02d:%02d.%d", duration.toHours() % 24,
duration.toMinutes() % 60, duration.toSeconds() % 60, duration.toMillis() % 1000);
System.out.println(formattedElapsedTime);
formattedElapsedTime = String.format("%2d:%02d:%02d.%d", duration.toHoursPart(), duration.toMinutesPart(),
duration.toSecondsPart(), duration.toMillisPart());
System.out.println(formattedElapsedTime);
}
}
输出:
PT34H17M36.789S
10:17:36.789
10:17:36.789
在线演示
从教程:日期时间了解更多关于现代日期时间API*的内容。
* 如果由于任何原因,您必须坚持使用Java 6或Java 7,则可以使用{{link1:ThreeTen-Backport}}将大多数java.time功能回退到Java 6和7。如果您正在为Android项目工作,并且您的Android API级别仍不符合Java-8,请检查{{link2:通过desugaring可用的Java 8+ API}}和{{link3:如何在Android项目中使用ThreeTenABP}}。Android 8.0 Oreo已经提供了{{link4:java.time
支持}}。
HH
代替hh
。删除时区sdf.setTimeZone(TimeZone.getTimeZone("UTC"))
。请参见下面的答案。 - notes-jj