7

我很难比较不同 TimeZones 中的两个 DateTime 对象。

我已经知道的:

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

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 年的日期)。

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

4

2 回答 2

9

您缺少的是,无论何时您从纪元开始以秒或毫秒为单位进行测量 - 始终以 UTC 为单位。

因此,您的sydneyDateTimenewYorkDateTime可能有不同的区域,但是由于它们都源自相同的aRandomTimeSinceTheEpoch值,因此它们都发生在同一时刻。因此,两者都不另一个之前。

以此类推,这就像问哪个更大,1 英寸还是 2.54 厘米?

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

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

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

于 2013-08-18T23:24:08.583 回答
2

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

于 2013-08-18T23:03:50.360 回答