Nodatime BclDateTimeZone EqualsImpl throws NotImplementedExc
本文关键字:NotImplementedExc throws EqualsImpl BclDateTimeZone Nodatime | 更新日期: 2023-09-27 18:30:06
Nodatime BclDateTimeZone
类中的EqualsImpl
方法抛出一个NotImplementedException
。这种行为是有记录的——这有原因吗?
如果测试使用BclDateTimeZone
的两个ZonedDateTime
的相等性,则会引发异常。
这是一个错误吗,看起来不对?
这种行为是有记录的——这有原因吗?
是的,基本上很难用一般的方式来确定区域平等。假设我们有两个BclDateTimeZone
实例,它们封装了两个不同的TimeZoneInfo
值。。。我们可以:
- 任意地说它们不相等,即使它们在逻辑上是等价的
- 按ID进行比较(在不支持ID的PCL中是不可能的,在Mono下也不可能,为什么
TimeZoneInfo.Local
的ID为Local
IIRC) - 通过历史来比较他们的平等,这是非常昂贵的
我同意这是一种痛苦,我认为我计划在Noda Time 2.0中完全删除ZonedDateTime
上的值相等,并使ZonedDateTime
使用引用相等。
如果希望比较时区,一个更好的选择可能是使用ZonedEqualityComparer
来指定您希望如何比较时区。
但是,当使用BCL值时,无法比较ZonedDateTime
值的相等性肯定是令人讨厌的。我为此提出了一个错误;我正在准备1.3.1版本,我可能会看看是否可以在那里修复它,而不是等待2.0。
在尝试编写失败的单元测试来证明这个错误之后,我发现很难复制。
比较在不同偏移上具有BclDateTimeZone
的ZonedDateTime
不是问题。将ZonedDateTime
s与不同的LocalDateTime
s进行比较不是问题。
我从来源中可以看出,只有当LocalDateTime
和Offset
相等时,ZonedDateTime
和Zone
的比较才起作用。
我的问题出现在我在同一偏移量上使用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)
我可以很容易地解决这个问题,但它可能值得修复。