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 回答
是的,除了最后一个密钥名称是
Time Zones
(您删除了s
) . 您可以在this MSDN blog article中了解其工作原理 .它将适用于Windows注册表数据中存在的任何过去几年 . 您可以检查注册表中的每个子项,以查看可以为每个区域转换多长时间 . 但是,数据中存在各种错误和遗漏 . 一般而言,此数据的历史准确性并非接近其他来源,例如IANA / Olson时区数据库,您可以通过Noda Time使用 . 阅读更多the timezone tag wiki .
这个词是"daylight saving time" - 没有大写字母,一个字用于日光,缩写为
DST
是,Windows时区数据和
TimeZoneInfo
考虑DST .要转换为UTC,请使用
ConvertTimeToUtc
,而不是ConvertTimeFromUtc
.是的,Windows了解2007年美国的DST变化 . 但是,它并不知道earlier changes,例如1987年Uniform Time Act生效之前的值 . 为此,您需要IANA / Olson数据库 .
使用
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"的部分 .
根据我的经验
ConvertTimeFromUtc
适用于过去的日期 .在不同区域设置日期的最佳解决方案:
显示时
ConvertTimeFromUtc
. (如果它不起作用,请尝试在从DB返回的日期更改DateTime.DateTimeKind
)(我不确定美国在夏令时的变化,通常使用固定公式计算 . )