首页 文章

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

提问于
浏览
1

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

如果是这样,它是否仅适用于当前时间而不适用于过去几年或任何日期?我想知道我是否可以将'Eastern Standard Time'中的过去日期时间转换为' 2-1-2010 3:00 PM ' to GMT or UTC which follows the DLS (Day Light Saving) for the year 2010? Take another year like ' 2-1-2006 3:00 PM '作为示例 . 当您阅读here时,DST在2007年已经改变为美国 .

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

2 回答

  • 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 .

    我想知道我是否可以将“东部标准时间”中的过去日期时间(例如“2-1-2010 3:00 PM”)转换为遵循2010年DLS(日间节能)的GMT或UTC?以“2-1-2006 3:00 PM”为例,再过一年 . 正如您在此阅读的那样,DST在2007年已经改变为美国 .

    • 这个词是"daylight saving time" - 没有大写字母,一个字用于日光,缩写为 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转换为查看者的时区 .

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

    您还可以在我的Pluralsight课程中找到关于此主题的扩展指导,Date and Time Fundamentals . 具体来说,您应该考虑查看 Headers 为"Time Zones","Date and Time in the .NET Framework"和"Introducing Noda Time"的部分 .

  • 1

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

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

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

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

相关问题