Nodatime BclDateTimeZone EqualsImpl throws NotImplementedExc

本文关键字:NotImplementedExc throws EqualsImpl BclDateTimeZone Nodatime | 更新日期: 2023-09-27 18:30:06

Nodatime BclDateTimeZone类中的EqualsImpl方法抛出一个NotImplementedException。这种行为是有记录的——这有原因吗?

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

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

Nodatime BclDateTimeZone EqualsImpl throws NotImplementedExc

这种行为是有记录的——这有原因吗?

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

  • 任意地说它们不相等,即使它们在逻辑上是等价的
  • 按ID进行比较(在不支持ID的PCL中是不可能的,在Mono下也不可能,为什么TimeZoneInfo.Local的ID为LocalIIRC)
  • 通过历史来比较他们的平等,这是非常昂贵的

我同意这是一种痛苦,我认为我计划在Noda Time 2.0中完全删除ZonedDateTime上的值相等,并使ZonedDateTime使用引用相等。

如果希望比较时区,一个更好的选择可能是使用ZonedEqualityComparer来指定您希望如何比较时区。

但是,当使用BCL值时,无法比较ZonedDateTime值的相等性肯定是令人讨厌的。我为此提出了一个错误;我正在准备1.3.1版本,我可能会看看是否可以在那里修复它,而不是等待2.0。

在尝试编写失败的单元测试来证明这个错误之后,我发现很难复制。

比较在不同偏移上具有BclDateTimeZoneZonedDateTime不是问题。将ZonedDateTime s与不同的LocalDateTime s进行比较不是问题。

我从来源中可以看出,只有当LocalDateTimeOffset相等时,ZonedDateTimeZone的比较才起作用。

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

我可以很容易地解决这个问题,但它可能值得修复。

相关文章:
  • 没有找到相关文章