java.time 和 ThreeTenABP
我建议使用现代 Java 日期和时间 API java.time 来计算日期和时间。
ZoneId zone = ZoneId.of("America/Chicago");
String dateString = "2020-06-08";
LocalDate date = LocalDate.parse(dateString);
Instant startOfDay = date.atStartOfDay(zone).toInstant();
Instant endOfDay = date.plusDays(1).atStartOfDay(zone).toInstant();
System.out.println("The day is from " + startOfDay + " (inclusive) to " + endOfDay + " (exclusive)");
输出是:
这一天从2020-06-08T05:00:00Z(含)到
2020-06-09T05:00:00Z(独家)
为了不排除一天的最后一毫秒,我们需要将这一天计算为持续到第二天的第一时刻。如果你坚持要减去一毫秒或一纳秒,当然,这取决于你。例如:
Instant endOfDay = date.plusDays(1).atStartOfDay(zone).minusNanos(1).toInstant();
这一天从2020-06-08T05:00:00Z(含)到
2020-06-09T04:59:59.999999999Z(包括 1 纳米以上)
编辑:如何在输出中打印毫秒?你很可能不需要那个。您要求的格式是国际标准 ISO 8601(请参阅底部的链接)。在 ISO 8601 中,秒的分数是可选的,省略它意味着 0。所以任何需要 ISO 8601 的 API 都应该接受上述内容。只有在没有的情况下,正确的解决方案是使用格式化程序。在这种情况下,我们需要将时间显式转换为 UTC:
ZoneId zone = ZoneId.of("America/Chicago");
DateTimeFormatter formatterWithMillis = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSX");
String dateString = "2020-06-08";
LocalDate date = LocalDate.parse(dateString);
OffsetDateTime startOfDay = date.atStartOfDay(zone)
.toOffsetDateTime()
.withOffsetSameInstant(ZoneOffset.UTC);
OffsetDateTime endOfDay = date.plusDays(1)
.atStartOfDay(zone)
.toOffsetDateTime()
.withOffsetSameInstant(ZoneOffset.UTC);
String startString = startOfDay.format(formatterWithMillis);
String endString = endOfDay.format(formatterWithMillis);
System.out.println("The day is from " + startString + " (inclusive) to " + endString + " (exclusive)");
这一天是从2020-06-08T05:00:00.000Z(含)到
2020-06-09T05:00:00.000Z(独家)
或者像以前一样从结束时间减去一纳秒后:
OffsetDateTime endOfDay = date.plusDays(1)
.atStartOfDay(zone)
.minusNanos(1)
.toOffsetDateTime()
.withOffsetSameInstant(ZoneOffset.UTC);
这一天是从2020-06-08T05:00:00.000Z(含)到
2020-06-09T04:59:59.999Z(包括和 1 纳米以上)
(由于时间被截断为整毫秒,1 nano more 并没有真正意义,但我认为这不是重点。)
问题:java.time 不需要 Android API 26 级吗?
java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少 Java 6。
- 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。
- 在非 Android 的 Java 6 和 7 中,获取 ThreeTen Backport,这是现代类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
- 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从
org.threeten.bp 导入日期和时间类以及子包。
但是除了切换到 ThreeTenBP 之外,我们没有其他选择吗?
图书馆?
如果你坚持,我想可以找到使用Calendar、Date和SimpleDateFormat的方法。这些类设计不佳且早已过时,因此根据我所知道和不知道的情况,我更喜欢 ThreeTenABP。
链接