我使用以下功能将日期时间从UTC转换为我当地时间(West Australian Standard,+ 8 GMT)。
var waTimeZone = TimeZoneInfo.FindSystemTimeZoneById("W. Australia Standard Time");
var timeInWA = TimeZoneInfo.ConvertTime(utcDateTime, TimeZoneInfo.Utc, waTimeZone);
但是,对于生产服务器中的某些日期时间,此代码的启动行为不正确。
E.g
如果我转换31/10/2011 00:00 - > 31/10/2011 09:00而不是31/10/2011 08:00。
如果我转换01/10/2011 00:00 - > 01/10/2011 08:00这是正确的。
这段代码在制作完成后已经运行了一段时间,我们几天前注意到了这一点。服务器设置为GMT +8,但我认为这不会影响这段代码。
同样的代码在其他服务器和本地机器上运行良好。
有人可以提供一些可能导致这种行为改变的想法吗? Windows更新? IIS配置更改? .Net bug?等...
更新: 我检查了更多信息,正如Yahia建议的那样。结果正在进行测试。
waTimeZone.IsDaylightSavingTime(date) --> False
waTimeZone.GetUtcOffset(date) --> 08:00:00
但我仍然得到+9小时而不是+8的错误转换。所以.Net在这里有些不一致。
但是,我检查了服务器的注册表项,提供了错误的转换,本地计算机为我提供了正确的答案,这很有意思。
我认为我们的IT人员尚未将DST补丁更新到服务器。
更新:确认IT人员在其DST补丁安装中错过了此服务器。这是造成这种行为的根本原因。
答案 0 :(得分:3)
我怀疑您列出的日期/时间在夏令时方面有所不同 - 为了确保确实如此,请检查以下两个值和waTimeZone
:
据我所知,澳大利亚的部分地区不再有DST(2009年DST结束 - 请参阅WA政府链接http://wa.gov.au/daylightsaving/)。 您看到的不是错误,而是您错过了适用于服务器的某些操作:
对于MS Windows,您需要采取一些措施来适应这一变化 - 请参阅http://technet.microsoft.com/en-au/bb821275.aspx