c#-野田时间:如何表示“标准时间”
作者:互联网
我从一个文本文件中接收数据,该文件中的日期通常以“标准时间”(例如“中央标准时间”或“东部标准时间”.我的意思是没有观察到夏令时调整).我正在使用Noda Time,试图找出代表这一点的最佳方法.
我首先想到的是应该为此创建一个DateTimeZone.我注意到tz数据库中包含一些“标准时间”时区(例如,“美国/坎昆”可用于东部标准时间),但是其他时区似乎没有任何东西可以代表其“标准时间”数据库中的变体.
然后我以为应该做一个Offset,或者直接从Offset做一个DateTimeZone,但是我似乎找不到一种方法来获取DateTimeZone的基本偏移.对于美国大陆的时区,我非常确定我可以执行DateTimeZone.ForOffset(localTimeZone.MinOffset)(其中localTimeZone是DateTimeZone),但是我非常怀疑这是否可以在某些更奇怪的时区中使用.我也试过
DateTimeZone.ForOffset(localTimeZone.GetZoneInterval(SystemClock.Instance.GetCurrentInstant()).StandardOffset)
但这是如此round回,我怀疑这是不正确的原因.
我可以只存储与每个文件提供者关联的原始偏移量,但是如果配置说它在中央标准时间而不是偏移量为-6,则配置应用程序要容易得多.
我是否想办法做到这一点?还是我将问题概念化的方式有问题,以至于这不是正确的方法?
解决方法:
DateTimeZone不一定有单个“基本偏移”.它会随着时间变化.例如,阿拉斯加大部分地区的标准时间在1983年从UTC-10更改为UTC-9.
现在,这对于您感兴趣的时区可能不是问题…在这种情况下,您可以使用“在当前时刻为本地时区找到标准偏移量,然后创建一个恒定偏移量的方法DateTimeZone from”.我可能会使用三个语句,而不是您当前使用的大型表达式,但是它将满足您的要求.
如果您想要的时区等于现有时区,包括对其标准偏移量的任何更改,但没有任何夏令时,则很难实现.可以做到,但绝非易事.您可能希望拥有自己的DateTimeZone子类,该子类接受现有的DateTimeZone并从开始到某个合适的终点(例如2200,作为将来不会在此后指定任何规则更改的未来日期)对所有ZoneInterval值进行迭代相当长的时间),然后计算出新的ZoneInterval值.如果需要,我可以提供一个示例实现,但是您真的想考虑一下是否首先要实现它.
这是一些代码,向您显示在1930年至2100年之间的某个时点更改了标准偏移的所有时区-显然,您可以轻松更改间隔以更改条件以更紧密地匹配您的上下文.
using System;
using System.Linq;
using NodaTime;
using NodaTime.Extensions;
class Test
{
static void Main()
{
Instant min = Instant.FromUtc(1930, 1, 1, 0, 0, 0);
Instant max = Instant.FromUtc(2100, 1, 1, 0, 0, 0);
foreach (var zone in DateTimeZoneProviders.Tzdb.GetAllZones())
{
var initialStandard = zone.GetZoneInterval(min).StandardOffset;
var zoneIntervals = zone.GetZoneIntervals(min, max);
var firstChange = zoneIntervals.FirstOrDefault(zi => zi.StandardOffset != initialStandard);
if (firstChange != null)
{
Console.WriteLine(zone.Id);
Console.WriteLine($"Initial standard offset: {initialStandard}");
Console.WriteLine($"First different standard offset: {firstChange}");
Console.WriteLine();
}
}
}
}
标签:nodatime,c 来源: https://codeday.me/bug/20191024/1924602.html