gpt4 book ai didi

c# - .NET NodaTime 如何创建自定义时区?

转载 作者:行者123 更新时间:2023-11-30 23:20:50 26 4
gpt4 key购买 nike

我想创建一个自定义(不存在的)时区,它遵循与欧洲/伦敦完全相同的规则,但唯一的区别是偏移量应为距 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 Time 2.0 - 在时间的开始和结束时,StartEnd 属性将不起作用,但它应该在您可能实际遇到的任何时刻都绝对没问题。

关于c# - .NET NodaTime 如何创建自定义时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39597086/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com