Java Joda Time Date时区比较不正确
我一直在为一个使用Joda Time的项目进行单元测试,我注意到应该代表同一时区的Java Joda Time Date时区比较不正确,java,timezone,jodatime,Java,Timezone,Jodatime,我一直在为一个使用Joda Time的项目进行单元测试,我注意到应该代表同一时区的DateTimeZone实例在equals上没有返回true。特别是在下面这样的单元测试中 //应该是相同的 DateTimeZone WAT=DateTimeZone.forOffsetHours(1);//格林尼治时间+01:00 DateTimeZone LAG=DateTimeZone.forID(“非洲/拉各斯”);//拉各斯 DateTime样本=新的DateTime(2017,11,15,10,50)
DateTimeZone
实例在equals
上没有返回true。特别是在下面这样的单元测试中
//应该是相同的
DateTimeZone WAT=DateTimeZone.forOffsetHours(1);//格林尼治时间+01:00
DateTimeZone LAG=DateTimeZone.forID(“非洲/拉各斯”);//拉各斯
DateTime样本=新的DateTime(2017,11,15,10,50);
DateTime dtzWAT=样本,带区域包含字段(WAT);
DateTime dtzLAG=sample.withZoneRetainFields(滞后);
@测试公共空比较器(){assertEquals(WAT,LAG);}
@Test public void compareTimes(){assertEquals(dtzWAT,dtzLAG);}
即使Africa/Lagos
和GMT+01:00
是同一时区,并且两个DateTimes
代表相同的瞬间,这两个测试仍然失败-事实上,下面的两个测试证实了这一点
//两者都成功了
@测试公共空间比较(){
assertEquals(dtzWAT.toString(),dtzLAG.toString());
}
@测试公共void checkSameTime(){
资产虚假(dtzLAG.isBefore(dtzWAT));
资产虚假(dtzWAT.isBefore(dtzLAG));
}
为什么会发生这种情况?为什么这两个时区的实例不相等,这附近还有其他原因吗?任何帮助都将不胜感激
为什么会发生这种情况
DateTimeZone
s不相等:一个称为Africa/Lagos
,另一个称为GMT+01:00
。上面写着
如果相等,则为true,基于ID和所有内部规则
以及:
将此对象与指定对象进行比较,以根据毫秒瞬间、时间顺序和时区确定相等性
时区不相等,因此DateTime
s不相等
也许他们实际上是平等的,但并不意味着他们实际上是平等的
请注意,
java.util.TimeZone
有hasSameRules(…)
方法,这是一个独立于相等的概念。“有什么办法可以解决这个问题吗”您实际上在试图解决什么问题?@AndyTurner我需要一种方法使DateTime实例相等。我知道他们实际上是平等的,但我需要用equals
方法来反映这一点。但平等在什么意义上呢?如果要确保它们在时间上引用相同的瞬间(与Unix历元的偏移量相同),请使用.toInstant()
将它们转换为instant
,然后进行比较(或使用!a.isAfter(b)和&!b.isAfter(a)
;或a.compareTo(b)==0
,但请注意这与等于不一致)。