Nodatime BclDateTimeZone EqualsImpl抛出NotImplementedException

时间:2014-11-11 20:50:41

标签: c# nodatime

Nodatime EqualsImpl课程中的BclDateTimeZone方法会引发NotImplementedException。据记载,这样做是有原因的吗?

如果测试使用ZonedDateTime的两个BclDateTimeZone的相等性,则会引发异常。

这是一个错误,它看起来不对吗?

2 个答案:

答案 0 :(得分:2)

  

有记录表明这样做是有原因的吗?

是的 - 基本上很难以一般方式确定区域平等。假设我们有两个BclDateTimeZone个实例,它们包含两个不同的TimeZoneInfo值......我们可以:

  • 说他们不等于任意,即使他们逻辑等同
  • 按ID进行比较(在PCL中不可能不支持ID,在Mono下断开,为什么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的比较仅在LocalDateTimeOffset相等的情况下发挥作用。

我的问题出现在我在同一偏移量上使用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)

我可以轻松解决这个问题,但可能值得修复。