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

Java Joda-如何在不忽略时区的情况下比较两个DateTime对象,java,datetime,timezone,jodatime,epoch,Java,Datetime,Timezone,Jodatime,Epoch,我很难比较在不同时区的两个DateTime对象 我已经知道: 1) 我知道“isBefore()”方法不考虑时区。因此,下面的“如果”条件不是真的(尽管我希望它是真的): 2) 根据这个答案()看来正确的方法是按句点来做,因为句点是我要做的事情的正确概念。但是,该代码有时会抛出一个“UnsupportedOperationException-如果周期包含年或月”异常(因为我处理的日期可能彼此相差2年) 简而言之,我想要的只是一个考虑时区的“isBefore()”方法。(而且它不会引发像上面那样的

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

我已经知道:

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

2) 根据这个答案()看来正确的方法是按句点来做,因为句点是我要做的事情的正确概念。但是,该代码有时会抛出一个“UnsupportedOperationException-如果周期包含年或月”异常(因为我处理的日期可能彼此相差2年)


简而言之,我想要的只是一个考虑时区的“isBefore()”方法。(而且它不会引发像上面那样的异常)。如何在Joda中实现这一点?

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

您缺少的是,从历元开始以秒或毫秒为单位测量的任何时间,都是UTC

因此,您的
sydneyDateTime
newYorkDateTime
可能有不同的区域,但由于它们都来自相同的
ArandomTimesincethePoch
值,因此它们都出现在同一个精确时刻。因此,两者都不在对方之前

打个比方,这就像问哪个更大,1英寸还是2.54厘米

从您的评论来看,您似乎想比较每个时区的本地时间,您可以这样做:

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

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

谢谢你的回答,但我相信你没有理解我的问题。getMillis()给我的值完全相同,无论我在哪个时区。所以,我不能用它来比较。如果
getMillis()
给了你完全相同的值,那么你的时间就是完全相同的瞬间。正如Matt所提到的,您想要的似乎是比较两次的年/月/日/小时/分钟/秒的数值,在这种情况下,将它们转换为
LocalDateTime
是一种方法。使用
withZoneRetainFields()
将一个日期转换为另一个日期的时区,然后比较它们可能会快一些,但我还没有测试过。感谢您的回复。我知道这一点。我写的代码只是一个例子,让我的问题更清楚。但我的问题是,如何将这两个日期与时区信息进行比较?我知道它们都代表了从纪元到时间的同一瞬间(这就是为什么isBefore无法完成我想要做的事情,因为在内部,isBefore使用从纪元到日期的毫秒来比较DateTime对象),但是如果我不想忽略时区,我该怎么做呢?只是澄清一下,你是说你想把悉尼的当地时间和纽约的当地时间进行比较?(就像在我的类比中说2.54大于1)正确。从我问题的第二点开始的周期解非常接近,只是当两个被比较的日期时间彼此相差太远时(即,当它们相差超过1个月时),它会失败。请使用
.toLocalDateTime()
查看我的更新答案。你不应该只为了比较而去关心
Period
数学。似乎就是这样!今天晚些时候我会进行测试,如果你的答案有效的话,我会接受你的答案。真不敢相信事情竟如此简单。:)
if( newYorkDateTime.toLocalDateTime().isBefore(sydneyDateTime.toLocalDateTime()) )