如何创建自定义时区?



我想创建一个自定义的(不存在的)时区,它遵循与欧洲/伦敦完全相同的规则,但唯一的区别是偏移量应该从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));
        }
    }

这当然不是一个非常常见的场景,但它绝对是支持的。(例如,与创建自己的日历不同。)

您将通过GetZoneInterval指定夏令时-该方法是类的关键。需要正确处理的重要事项是:

  • 带最小/最大偏移量的链式构造函数调用(您的最大值将是UTC-4,而不是UTC-5)
  • GetZoneInterval
  • 相等/哈希码,你可以随时使身份相等。

例如,你可以写:

public class LondonOffsetZone : DateTimeZone
{
    private readonly DateTimeZone london;
    // This assumes London has a minimum of +0 and a maximum of +1.
    // To do it better, you'd resolve Europe/London and find *its*
    // min/max, and add -5 hours to each.
    public LondonOffsetZone()
        : base("LondonOffset", false, Offset.FromHours(-5), Offset.FromHours(-4))
    {
        london = DateTimeZoneProviders.Tzdb["Europe/London"];
    }
    public override int GetHashCode() => RuntimeHelpers.GetHashCode(this);
    // Base Equals method will have handled reference equality already.
    protected override bool EqualsImpl(DateTimeZone other) => false;
    public override ZoneInterval GetZoneInterval(Instant instant)
    {
        // Return the same zone interval, but offset by 5 hours.
        var londonInterval = london.GetZoneInterval(instant);
        return new ZoneInterval(
            londonInterval.Name,
            londonInterval.Start,
            londonInterval.End,
            londonInterval.WallOffset + Offset.FromHours(-5),
            londonInterval.Savings);
    }
}

这将失败-至少在Noda时间2.0 -在时间的开始和结束时,StartEnd属性将不起作用,但它应该是绝对好的任何瞬间你可能实际遇到。

相关内容

  • 没有找到相关文章

最新更新