虽然其他答案有效并且在 2010 年是很好的答案,但我提供的是现代答案。
java.time 和 ThreeTenABP
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
ZoneId zone = ZoneId.systemDefault();
String startDateString = "2019-12-31 23:34:45";
String endDateString = "2020-01-01 07:56:34";
ZonedDateTime start = LocalDateTime.parse(startDateString, formatter).atZone(zone);
ZonedDateTime end = LocalDateTime.parse(endDateString, formatter).atZone(zone);
long diffSeconds = ChronoUnit.SECONDS.between(start, end);
System.out.println("Difference: " + diffSeconds + " seconds");
在大多数时区,此代码段的输出将是:
差异:30109 秒
我正在使用它是ZonedDateTime
因为它考虑了夏令时 (DST) 和其他时间异常的转换。当然,它要求您使用正确的时区。如果在您将日期和时间存储到数据库后更改了设备的时区设置,您可能会遇到一些意外。为防止这种情况,您可以将 UTC 偏移量与您的时间一起存储,然后OffsetDateTime
在检索时将其解析。
问题:java.time 不需要 Android API 级别 26 吗?
java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少Java 6。
- 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 开始)中,现代 API 是内置的。
- 在非 Android Java 6 和 7 中获得 ThreeTen Backport,现代类的后向端口(ThreeTen 用于 JSR 310;请参阅底部的链接)。
- 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从
org.threeten.bp
子包中导入日期和时间类。
链接