java - 如何正确使用 ThreeTenABP 获取基于 UTC 的两个日期之间的时间(以毫秒为单位)

标签 java android java-time date-difference threetenbp

我正在使用我刚刚发现的这个库,据说它比 Android 的 Joda 时间更轻,我说管它呢,让我们使用它吧。但是现在我正在努力在网上找到任何关于如何使用它的好例子,除了这两种方法之外:

// ZonedDateTime contains timezone information at the end
// For example, 2011-12-03T10:15:30+01:00[Europe/Paris]
public static ZonedDateTime getDate(String dateString) {
    return ZonedDateTime.parse(dateString).withZoneSameInstant(ZoneId.of("UTC"));
}

public static String formatDate(String format, String dateString) {
    return DateTimeFormatter.ofPattern(format).format(getDate(dateString));
}

那么我怎样才能用这个库得到两个日期之间的差异呢?

最佳答案

有多种选择,具体取决于您对获得的差异的需求。

最容易找到以某个时间单位衡量的差异。使用 ChronoUnit.between。例如:

    ZonedDateTime zdt1 = getDate("2011-12-03T10:15:30+01:00[Europe/Paris]");
    ZonedDateTime zdt2 = getDate("2017-11-23T23:43:45-05:00[America/New_York]");

    long diffYears = ChronoUnit.YEARS.between(zdt1, zdt2);
    System.out.println("Difference is " + diffYears + " years");

    long diffMilliseconds = ChronoUnit.MILLIS.between(zdt1, zdt2);
    System.out.println("Difference is " + diffMilliseconds + " ms");

这打印:

Difference is 5 years
Difference is 188594895000 ms

我正在使用您的 getDate 方法,因此所需的格式是 ZonedDateTime(根据 ISO 8601 修改),例如 2011-12-03T10: 15:30+01:00[欧洲/巴黎]。秒和秒的小数部分是可选的,方括号中的时区 ID 也是可选的。

顺便说一句,您无需转换为 UTC 即可找到差异。即使您忽略了该转换,您也会得到相同的结果。

您还可以得到年、月和日的差异。 Period 类可以给你这个,但它不能处理一天中的时间,所以首先转换为 LocalDate:

    Period diff = Period.between(zdt1.toLocalDate(), zdt2.toLocalDate());
    System.out.println("Difference is " + diff);

Difference is P5Y11M21D

输出意味着 5 年 11 个月 21 天的时间。起初语法可能有点奇怪,但很简单。它由 ISO 8601 标准定义。在这种情况下,时区很重要,因为所有时区的日期都不会相同。

要获得小时、分钟和秒的差异,请使用 Duration 类(我引入了一个新时间,因为使用 Duration 将近 6 年太不典型了(尽管可能))。

    ZonedDateTime zdt3 = getDate("2017-11-24T18:45:00+01:00[Europe/Copenhagen]");
    Duration diff = Duration.between(zdt2, zdt3);
    System.out.println("Difference is " + diff);

Difference is PT13H1M15S

一段 13 小时 1 分 15 秒的时间。您已经从 2011-12-03T10:15:30+01:00[Europe/Paris] 知道的 T 也将日期部分与时间部分分开,因此您知道在这种情况下 1M 表示 1 分钟,而不是 1 个月。

关于java - 如何正确使用 ThreeTenABP 获取基于 UTC 的两个日期之间的时间(以毫秒为单位),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51833142/

相关文章:

java - 如何在Java中按行号搜索文本文件?

android - 非对话子菜单?

android - 在没有 SD 卡的情况下安装 Android 应用程序

java - 在 Java 中定义一些特定的日期格式化程序作为枚举的成员

java - 如何获取太平洋标准时间 (PST) 到午夜的毫秒数

java - 如何获取两个 Java.time.LocalTime 实例之间的小时数

java - LibGDX Scene2D 除了将所有内容乘以常数之外,还有一种不同的实现 GUI 比例设置的方法吗?

java - 如何在加入 HQL 时应用 2 个条件

java - Java 和 C++ 之间的 Murmurhash3 不对齐

java - 如何为 Kotlin 和 Gradle 设置 "sourceCompatibility"?