野田时间:如何表示“标准时间”

时间:2018-10-12 18:03:39

标签: c# nodatime

我从一个文本文件接收数据,该文件的日期通常以“标准时间”(如“中央标准时间”或“东部标准时间”。我的意思是未观察到夏令时调整)。我正在尝试使用Noda Time,来找出代表这一点的最佳方法。

我首先想到的是应该为此创建一个DateTimeZone。我注意到tz数据库中包含一些“标准时间”时区(例如,“美国/坎昆”可用于东部标准时间),但是其他时区似乎没有任何东西可以代表其“标准时间”数据库中的变体。

然后我认为我应该进行偏移,或者直接从偏移进行DateTimeZone的处理,但是我似乎无法找到一种方法来获取DateTimeZone的基本偏移。对于美国大陆的时区,我非常确定我可以做DateTimeZone.ForOffset(localTimeZone.MinOffset)(其中localTimeZone是DateTimeZone),但是我非常怀疑这种方法是否可以在某些更奇怪的时区中使用。我也试过 DateTimeZone.ForOffset(localTimeZone.GetZoneInterval(SystemClock.Instance.GetCurrentInstant()).StandardOffset) 但这是如此round回,我怀疑这是不正确的原因。

可以仅仅存储与每个文件提供者相关的原始偏移量,但是如果配置说它在中央标准时间而不是说它有一个偏移量,则配置应用程序要容易得多。 -6。

我是否缺少执行此操作的方法?还是我将问题概念化的方式有问题,以至于这不是正确的方法?

1 个答案:

答案 0 :(得分:4)

DateTimeZone不一定有单个“基本偏移”。它会随着时间变化。例如,阿拉斯加大部分地区的标准时间在1983年从UTC-10更改为UTC-9。

现在,对于您感兴趣的时区来说 可能不是问题...在这种情况下,您可以使用“在本地时区中找到标准偏移量的方法当前时刻,然后从该时刻创建一个常数偏移量DateTimeZone”。我可能会使用三个语句,而不是您当前使用的大型表达式,但这会满足您的要求。

如果您想要的时区等于现有时区,包括对其标准偏移量的任何更改,但没有任何夏令时,则很难实现。 可以完成,但并不是那么简单。您可能想要自己的DateTimeZone子类,该子类接受现有的DateTimeZone,并从开始到某个合适的终点(例如2200,例如以后不会在以后指定任何规则更改的未来日期),然后计算出您的 new ZoneInterval值。如果您愿意,我可以提供一个示例实现,但是您真的想考虑一下它是否是您首先想要的...

这里有一些代码向您显示在1930年至2100年之间的某个时间点更改了标准偏移的所有时区-显然,您可以轻松更改时间间隔以更改条件以更紧密地匹配您的上下文。

ZoneInterval