DateTime.Parse在XP与Windows 7/8上有所不同

cod*_*urn 4 .net windows datetime parsing date

在XP和Windows 7上执行以下操作会在.NET4与.NET2控制台应用程序中产生不同的结果:

Console.WriteLine(String.Format("DateTime.Parse on Client: {0}", 
   DateTime.Parse("1998-10-31T00:00:00-04:00")));
Run Code Online (Sandbox Code Playgroud)

.NET4
在XP下返回: 10/31/1998 12:00:00 AM
在Windows 7/Windows 8下返回: 10/30/1998 11:00:00 PM

.NET2
在XP下返回: 10/31/1998 12:00:00 AM
在Windows 7/Windows 8下返回: 10/31/1998 12:00:00 AM

为什么??!?

从字符串中删除TimeZone(-04:00)会导致.NET4下的XP和Windows 7上的值相同.当从字符串执行DateTime.Parse时,Windows XP似乎在.NET4下以不同的方式应用时区偏移量.有没有办法改变这种行为,以便它在.NET4下是一致的,无论操作系统如何(不涉及操纵发送到DateTime.Parse的字符串)

环境: 所有计算机都安装了最新的修补程序(可通过Windows Update获得),并配置为"东部时间",并在"时区设置"中选中"自动调整夏令时的时钟".

我已在使用.NET4的Windows 7计算机和使用.NET4.5的Windows 7计算机上确认了此行为

Han*_*ant 5

计算历史日期的本地时间要求.NET了解在该日期期间生效的夏令时规则.这当然是一件非常棘手的事情,因为DST规则在各地和日期之间变化很大.

您的日期的UTC偏移为-4,使其位于美国东部时区附近.最相关的夏令时规则改变了2005年能源政策法案,该法案将DST从3月的第2个星期日到11月的第1个星期日有效期延长,从2007年开始生效.因此了解当地时间1998年10月31日要求知道这项法律尚未生效.

这就是差异的来源.Windows Vista是第一个拥有这些DST更改数据库的Windows版本,.NET 4是第一个开始使用它的.NET版本.XP没有该数据库,因此.NET无法做任何事情,只是假设当前的DST规则生效.

这是您在与当地时间合作时需要处理的不可避免的损失.不要,使用UTC.