Joda - 如何在不忽略TimeZones的情况下比较两个DateTime对象

时间:2013-08-18 22:05:27

标签: java datetime timezone jodatime epoch

我很难比较不同时区的 的两个DateTime对象

我已经知道的事情:

1)我知道“isBefore()”方法考虑TimeZones。因此,下面的“if”条件不正确(即使我希望它是真的):

long aRandomTimeSinceTheEpoch = 1234567789L;

String TIMEZONE_SYDNEY_AUSTRALIA = "Australia/Sydney";
DateTimeZone sydneyTimeZone = DateTimeZone.forID(TIMEZONE_SYDNEY_AUSTRALIA);
Chronology chronologySydney = GJChronology.getInstance(sydneyTimeZone);

String TIMEZONE_NEWYORK = "America/New_York";
DateTimeZone newYorkTimeZone = DateTimeZone.forID(TIMEZONE_NEWYORK);
Chronology chronologyNewYork = GJChronology.getInstance(newYorkTimeZone);

DateTime sydneyDateTime = new DateTime(aRandomTimeSinceTheEpoch, chronologySydney);
DateTime newYorkDateTime = new DateTime(aRandomTimeSinceTheEpoch, chronologyNewYork);

if( newYorkDateTime.isBefore(sydneyDateTime) ){
    System.out.println("true");
}

2)基于这个答案(https://stackoverflow.com/a/8793980),似乎正确的方法是通过Period而不是,因为Period是我想要做的正确的概念。但是,该代码有时会抛出“UnsupportedOperationException - 如果句点包含年份或月份”异常(因为我处理的日期可能相差最多2年)。

简而言之,我想要的只是一个“isBefore()”方法,它将TimeZones考虑在内。(并且不会抛出像上面那样的异常)。我如何在Joda中实现这一目标?

2 个答案:

答案 0 :(得分:8)

您所缺少的是,您可以在几秒钟或几毫秒内测量时间 - 始终为UTC。

因此,您的sydneyDateTimenewYorkDateTime可能有不同的区域,但由于它们都来自相同的aRandomTimeSinceTheEpoch值,因此它们都出现在同一时刻。因此之前都不是

通过类比,它就像问哪个更大,1英寸或2.54厘米?

根据您的评论,您似乎希望比较每个时区的本地时间,您可以这样做:

if( newYorkDateTime.toLocalDateTime().isBefore(sydneyDateTime.toLocalDateTime()) )

请注意,如果您始终从同一个源瞬间开始,那么此值将始终为true。就像2.54总是大于1一样。

答案 1 :(得分:2)

在每个日期使用getMillis()来获取毫秒数并进行比较,这将为您提供一对绝对的数字,以便进行比较。