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

How to properly use ThreeTenABP to get the time in milliseconds between two dates based on UTC

提问人: 提问时间:8/14/2018 最后编辑:Anonymous 更新时间:8/17/2018 访问量:2312

问:

我正在使用我刚刚发现的这个库,据说它比 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));
}

那么,我怎样才能通过这个库获得两个日期之间的差异呢?

android java-time 日期差 threetenbp

评论


答:

1赞 Anonymous 8/16/2018 #1

有几种选择,具体取决于您从获得的差异中需要什么。

最容易找到以某个时间单位测量的差异。用。例如: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

我正在使用您的方法,因此所需的格式是(从 ISO 8601 修改)格式,例如。秒和秒的分数是可选的,方括号中的时区 ID 也是可选的。getDateZonedDateTime2011-12-03T10:15:30+01:00[Europe/Paris]

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

你也可能会得到年、月和日的差异。该类可以为您提供此内容,但它无法处理一天中的时间,因此请转换为 first:PeriodLocalDate

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

区别在于P5Y11M21D

输出是指 5 年 11 个月 21 天的期限。语法一开始可能感觉有点奇怪,但很简单。它由 ISO 8601 标准定义。在这种情况下,时区很重要,因为它在所有时区中都不是相同的日期。

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

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

差异就是PT13H1M15S

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

评论

0赞 8/17/2018
哇,非常感谢!!非常感谢。如果你不介意告诉我将我的日期传递给 getDate() 方法的正确日期格式是这样的;yyyy-MM-dd'T'HH:mm:ss ?
1赞 8/18/2018
我找到了:“yyyy-MM-dd'T'HH:mm:ssXXX”
0赞 8/18/2018
顺便说一句,我的朋友,在我得到差异后,我如何转换为UTC?
0赞 Anonymous 8/18/2018
对不起,如果我不清楚;我的意思是,如果差异是您需要的,则根本不需要转换为UTC(也就是说,您可以选择从方法中省略)。.withZoneSameInstant(ZoneId.of("UTC"))
0赞 Syed Danish Haider 1/7/2019
我正在尝试您的代码,它的显示调用需要 API 级别 26.但我使用的是最低级别 17