【发布时间】:2016-09-20 14:41:25
【问题描述】:
我想创建一个自定义的(不存在的)时区,它遵循与欧洲/伦敦完全相同的规则,但唯一的区别是偏移量应该是距 UTC 的 -5 小时。
出于测试目的,这是我正在尝试的。如何指定夏令时?还是这个实现完全错误?
public class MyTimeZone : DateTimeZone
{
public MyTimeZone()
: base("MyTimeZone", true, Offset.FromHours(-5), Offset.FromHours(-5))
{
}
protected override bool EqualsImpl(DateTimeZone zone)
{
if (zone.Id == "MyTimeZone")
return true;
return false;
}
public override int GetHashCode()
{
return 0001;
}
public override NodaTime.TimeZones.ZoneInterval GetZoneInterval(Instant instant)
{
return new ZoneInterval("MyTimeZone", new Instant(DateTime.MinValue.Ticks), new Instant(DateTime.MaxValue.Ticks), Offset.FromHours(-5), Offset.FromHours(-5));
}
}
【问题讨论】:
-
我以前从未使用过NodaTime,但我可以告诉你,你的
GetHashCode函数完全错误。它需要返回一个相对唯一的值,以便识别不同的值。我建议返回区域 ID 的哈希码。我的猜测是基类应该已经在做类似的事情了。 -
感谢您的回复。我会确保纠正它。
-
我不认为 NodaTime 有一个 API 可以轻松做到这一点,但我相信 Jon 很快就会来回答这个问题。 :) 很好奇,这个的业务/应用程序用例是什么?当人们说他们需要自定义时区时,我总是很好奇。据我所知,大多数实际的实际使用并不真正需要它。
-
@BradleyUffner:不,返回一个常量值始终是
GetHashCode的正确实现。它通常不是最优,但它始终遵守GetHashCode的约定。返回 ID 的哈希值会更好,当然……但是说它“完全错误”是……完全错误的。 -
@MattJohnson 我个人不喜欢创建自定义时区的想法。玩弄时间似乎是不对的。我无法透露业务逻辑,但我们的应用程序中有自定义时区来处理某些类型的处理。