java.time
java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,改用modern Date-Time API*。
另外,下面引用的是来自home page of Joda-Time的通知:
请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。
使用现代日期时间 API java.time 的解决方案:您可以使用在 Java-8 中作为 JSR-310 implementation 的一部分引入的 java.time.Duration 来型号ISO_8601#Duration。 Java-9 引入了一些更方便的方法。
演示:
import java.time.Duration;
import java.time.Instant;
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String args[]) {
String strDateTime = "2016-01-24T16:00:00.000Z";
Instant then = Instant.parse(strDateTime);
Instant now = Instant.now();
Duration duration = Duration.between(then, now);
System.out.println(duration);
// ####################################Java-8####################################
String formatted = String.format("%d days %02d hours %02d minutes %02d seconds %02d milliseconds ago",
duration.toDays(), duration.toHours() % 24, duration.toMinutes() % 60, duration.toSeconds() % 60,
TimeUnit.MILLISECONDS.convert(duration.toNanos() % 1000_000_000, TimeUnit.NANOSECONDS));
System.out.println(formatted);
// ##############################################################################
// ####################################Java-9####################################
formatted = String.format("%d days %02d hours %02d minutes %02d seconds %02d milliseconds ago",
duration.toDaysPart(), duration.toHoursPart(), duration.toMinutesPart(), duration.toSecondsPart(),
TimeUnit.MILLISECONDS.convert(duration.toNanosPart(), TimeUnit.NANOSECONDS));
System.out.println(formatted);
// ####################################Java-9####################################
}
}
输出:
PT50117H11M53.914442S
2088 days 05 hours 11 minutes 53 seconds 914 milliseconds ago
2088 days 05 hours 11 minutes 53 seconds 914 milliseconds ago
ONLINE DEMO
通过 Trail: Date Time 了解有关 modern Date-Time API* 的更多信息。
* 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring。请注意,Android 8.0 Oreo 已经提供了support for java.time。