【问题标题】:Time Conversion with TimeZoneInfo for past years过去几年使用 TimeZoneInfo 进行时间转换
【发布时间】:2015-07-10 20:33:34
【问题描述】:

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

如果是这样,它是否仅适用于当前时间而不适用于任何过去的年份或日期?我想知道是否可以将“东部标准时间”中的过去日期时间(如“2-1-2010 3:00 PM”)转换为 GMT 或 UTC遵循 2010 年的 DLS(夏令时)?再以像“2-1-2006 3:00 PM”这样的另一年为例。如您所见here,美国的夏令时在 2007 年发生了变化。

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

【问题讨论】:

标签: c# timezone registry


【解决方案1】:

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

我想知道我是否可以将“东部标准时间”中的过去日期时间(例如“2010 年 2 月 1 日下午 3:00”)转换为 GMT 或 UTC,该时间遵循当年的 DLS(夏令时) 2010 年?再以像“2-1-2006 3:00 PM”这样的年份为例。正如您在此处阅读的,2007 年美国的 DST 发生了变化。

  • 术语是“夏令时”——没有大写字母,一个单词表示日光,缩写DST

  • 是的,Windows 时区数据和TimeZoneInfo 将 DST 考虑在内。

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

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

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

  • 如果使用TimeZoneInfo,则在纽约使用"Eastern Standard Time" ID,在马来西亚使用"Singapore Standard Time" ID。

  • 将 IANA/Olson 时区与 Noda Time"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 中找到有关此主题的扩展指南。具体来说,您应该考虑观看标题为“时区”、“.NET Framework 中的日期和时间”以及“Noda 时间简介”的部分。

【讨论】:

  • 另外,在未来,请考虑每个 StackOverflow 问题问一个问题,而不是四个问题。谢谢。
【解决方案2】:

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

在不同地区显示日期的最佳解决方案:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 2015-08-13
    相关资源
    最近更新 更多