有几个选项取决于您从获得的差异中需要什么。
最容易找到以某个时间单位测量的差异。使用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[Europe/Paris]
. 秒和秒的小数部分是可选的,方括号中的时区 ID 也是可选的。
顺便说一句,您不需要在发现差异之前转换为 UTC。即使您忽略该转换,您也会得到相同的结果。
您可能还会得到年、月和日的差异。这个Period
类可以给你这个,但它不能处理一天中的时间,所以LocalDate
先转换为:
Period diff = Period.between(zdt1.toLocalDate(), zdt2.toLocalDate());
System.out.println("Difference is " + diff);
区别是 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);
区别是PT13H1M15S
周期为 13 小时 1 分 15 秒。您从这里T
已经知道的2011-12-03T10:15:30+01:00[Europe/Paris]
也将日期部分与时间部分分开,因此您知道在这种情况下1M
意味着 1 分钟,而不是 1 个月。