过去几年使用TimeZoneInfo进行时间转换

时间:2015-04-30 23:44:37

标签: c# timezone registry

TimeZoneInfo.ConvertTimeFromUtc方法是否从注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zone读取夏令时设置以计算当地时间?

如果是这样,它是否仅适用于当前时间,而不适用于过去几年或任何日期?我想知道我是否可以在东部标准时间&#39;中转换过去的日期时间喜欢&#39; 2-1-2010 3:00 PM &#39;遵循2010年DLS(日间节能)之后的GMT或UTC?再过一年如<&lt; 2-1-2006 3:00 PM &#39;作为一个例子。当您阅读here时,DST在2007年已经改变为美国。

请问,如果我必须在过去5年内在马来西亚和纽约(美国东部标准时间)这两个不同的当地人的SQL数据库中显示预约时间,那么最佳解决方案是什么?

2 个答案:

答案 0 :(得分:2)

  

TimeZoneInfo.ConvertTimeFromUtc方法是否从注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zone读取夏令时设置以计算当地时间?

是的,除了最后一个密钥名称为Time Zones(您删除了s)。您可以在this MSDN blog article中了解其工作原理。

  

如果是这样,它是否仅适用于当前时间而不适用于过去几年或任何日期?

它适用于Windows注册表数据中存在的任何过去几年。您可以检查注册表中的每个子项,以查看可以为每个区域转换多长时间。但是,数据中存在各种错误和遗漏。一般而言,此数据的历史准确性并非接近其他来源,例如IANA / Olson时区数据库,您可以通过Noda Time使用该数据库。阅读the timezone tag wiki中的更多内容。

  

我想知道我是否可以在“东部标准时间”中转换过去的约会时间&#39;喜欢&#39; 2-1-2010 3:00 PM&#39;遵循2010年DLS(日间节能)之后的GMT或UTC?再过一年,如#2-1; 2-1-2006 3:00 PM&#39;作为一个例子。正如您在此阅读的那样,DST在2007年已经改变为美国。

  • 这个词是&#34;夏令时&#34; - 没有大写字母,白天用一个词,缩写为DST

  • 是的,Windows时区数据,TimeZoneInfo考虑了DST。

  • 要将转换为 UTC,请使用ConvertTimeToUtc,而不是ConvertTimeFromUtc

  • 是的,Windows了解2007年美国的DST变化。它确实,了解earlier changes,例如1987年Uniform Time Act生效之前的值。为此,您需要IANA / Olson数据库。

  

请问,如果我必须在过去5年内在马来西亚和纽约(美国东部标准时间)这两个不同的当地人的SQL数据库中显示预约时间,那么最佳解决方案是什么?

  • 使用TimeZoneInfo使用纽约的ID "Eastern Standard Time" ID和马来西亚的"Singapore Standard Time" ID。

  • 使用Noda Time的IANA / Olson时区,使用"America/New_York""Asia/Kuala_Lumpur"

  • 在您询问的最近5年内,这两种选择都没问题。 Malaysia's last time zone change was in 1982

  • 对于过去的事件,将UTC时间存储在数据库中,或者使用事件时区的正确时间和偏移量存储DateTimeOffset值(请参阅DateTime vs DateTimeOffset)。根据需要将UTC从UTC转换为查看者的时区。

  • 要安排未来事件,请将事件的本地时间存储在数据库中,然后按the guidance I've written here

您还可以在我的Pluralsight课程Date and Time Fundamentals中找到有关此主题的扩展指南。具体来说,您应该考虑观看标题为“#34;时区&#34;”,“#34; .NET Framework中的日期和时间&#34;”和“#34;介绍Noda Time&#34;”的部分。

答案 1 :(得分:1)

根据我的经验ConvertTimeFromUtc适用于过去的日期。

在不同区域设置日期的最佳解决方案:

  • 将日期存储为UTC(您可能必须运行脚本以转换现有的entires)
  • 在显示时在相关时区使用ConvertTimeFromUtc。 (如果它不起作用,请尝试更改从DB返回的日期DateTime.DateTimeKind

(我不确定美国夏令时的变化,通常使用固定公式计算。)