TimeZoneInfo 过去几年的时间转换

Time Conversion with TimeZoneInfo for past years

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

如果是这样,它是否只适用于当前时间而不适用于过去的年份或日期?我想知道我是否可以在 'Eastern Standard Time' 中转换 过去的日期时间 ,例如 '2-1-2010 3:00 PM' 到 2010 年 DLS(夏令时)之后的 GMT 或 UTC?以另一年为例,例如 '2-1-2006 3:00 PM'。在您阅读 here 时,美国的 DST 在 2007 年发生了变化。

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

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

在不同语言环境中显示日期的最佳解决方案:

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

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

Does the TimeZoneInfo.ConvertTimeFromUtc method read the daylight saving settings from the registry HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zone to calculate the local time?

是的,除了最后一个键名是 Time Zones(您删除了一个 s)。您可以在 this MSDN blog article.

中了解其工作原理

If so, does it work for only the current time and not for any past years or dates?

它将适用于 Windows 注册表数据中存在的任何过去年份。您可以检查注册表中的每个子项,看看您可以为每个区域转换多远。但是,数据中存在各种错误和遗漏。一般来说,此数据的历史准确性不如其他来源(例如 IANA/Olson 时区数据库,您可以通过 Noda Time. Read more in the timezone tag wiki.

使用)

I would like to know if I can convert a past date time in 'Eastern Standard Time' like '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' as an example also. As you read here, the DST has changed in 2007 for the US.

  • 术语是"daylight saving time" - 没有大写字母,一个单词表示日光,缩写为DST

  • 是的,Windows时区数据,TimeZoneInfo考虑夏令时。

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

  • 是的,Windows 知道美国 2007 年夏令时的变化。它确实 而不是 但是,了解 earlier changes, such as values before the Uniform Time Act 于 1987 年生效。为此,您需要 IANA/Olson 数据库。

May I ask, what is the best solution if I have to display an appointment time from a SQL database in two different locals like Malaysia and New York (USA Eastern Standard Time) for a visitor in the past 5 years?

  • Using TimeZoneInfo 纽约使用 ID "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 中找到有关此主题的扩展指导。具体来说,您应该考虑观看标题为 "Time Zones"、"Date and Time in the .NET Framework" 和 "Introducing Noda Time".

的部分