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数据库中显示预约时间,那么最佳解决方案是什么?
答案 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
适用于过去的日期。
在不同区域设置日期的最佳解决方案:
ConvertTimeFromUtc
。 (如果它不起作用,请尝试更改从DB返回的日期DateTime.DateTimeKind
)(我不确定美国夏令时的变化,通常使用固定公式计算。)