Nodatime EqualsImpl
课程中的BclDateTimeZone
方法会引发NotImplementedException
。据记载,这样做是有原因的吗?
如果测试使用ZonedDateTime
的两个BclDateTimeZone
的相等性,则会引发异常。
这是一个错误,它看起来不对吗?
答案 0 :(得分:2)
有记录表明这样做是有原因的吗?
是的 - 基本上很难以一般方式确定区域平等。假设我们有两个BclDateTimeZone
个实例,它们包含两个不同的TimeZoneInfo
值......我们可以:
TimeZoneInfo.Local
的ID为Local
IIRC)我同意这很痛苦,我认为我计划完全在Noda Time 2.0中删除ZonedDateTime
上的值相等,并使ZonedDateTime
使用引用相等。
如果您希望比较时区,更好的选择可能是使用ZonedEqualityComparer
来指定您希望如何比较时区。
但是在使用BCL值时无法比较ZonedDateTime
值的相等性肯定是令人讨厌的。我为此raised a bug;我正在准备1.3.1版本,我可能会看到我是否可以在那里修复它,而不是你必须等待2.0。
答案 1 :(得分:0)
在尝试编写失败的单元测试以证明此错误后,我发现很难复制。
比较ZonedDateTime
在不同偏移量上BclDateTimeZone
的问题不是问题。
将ZonedDateTime
与不同的LocalDateTime
进行比较不是问题。
我可以从消息来源看到ZonedDateTime
Zone
的比较仅在LocalDateTime
和Offset
相等的情况下发挥作用。
我的问题出现在我在同一偏移量上使用BclDateTimeZone
的两个不同引用的地方。我是在一个地方使用DateTimeZoneProviders.Bcl.GetSystemDefault()
而在另一个地方使用BclDateTimeZone.ForSystemDefault()
的。不用说,他们现在正在调用公共代码。
我有这个失败的测试,我在同一偏移量上比较两个ZonedDateTime
和不同的DateTimeZone
:
ZonedDateTime dtzOne = new ZonedDateTime(Instant.FromUtc(2014, 11, 11, 21, 00), DateTimeZoneProviders.Bcl.GetZoneOrNull("Greenwich Standard Time"));
ZonedDateTime dtzTwo = new ZonedDateTime(Instant.FromUtc(2014, 11, 11, 21, 00), DateTimeZoneProviders.Bcl.GetZoneOrNull("GMT Standard Time"));
Assert.That(dtzOne, Is.Not.EqualTo(dtzTwo));
此测试在此处引发异常:
System.NotImplementedException : The method or operation is not implemented.
at NodaTime.TimeZones.BclDateTimeZone.EqualsImpl(DateTimeZone zone)
at NodaTime.DateTimeZone.Equals(DateTimeZone obj)
at NodaTime.ZonedDateTime.Equals(ZonedDateTime other)
我可以轻松解决这个问题,但可能值得修复。