Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 在XP和Windows 7/8上解析不同的数据_.net_Windows_Parsing_Date_Datetime - Fatal编程技术网

.net 在XP和Windows 7/8上解析不同的数据

.net 在XP和Windows 7/8上解析不同的数据,.net,windows,parsing,date,datetime,.net,Windows,Parsing,Date,Datetime,在XP和Windows 7上执行以下操作会在.NET4和.NET2控制台应用程序中产生不同的结果: Console.WriteLine(String.Format("DateTime.Parse on Client: {0}", DateTime.Parse("1998-10-31T00:00:00-04:00"))); .NET4 在XP下返回:10/31/1998 12:00:00 AM 在Windows 7/Windows 8下返回:10/30/1998 11:00:00 PM

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

Console.WriteLine(String.Format("DateTime.Parse on Client: {0}", 
   DateTime.Parse("1998-10-31T00:00:00-04:00")));
.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

为什么

从字符串中删除时区(-04:00)会导致XP和Windows 7上.NET4下的值相同。当从字符串执行DateTime.Parse时,Windows XP似乎在.NET4下以不同的方式应用时区偏移量。是否有某种方法可以更改此行为,使其在.NET4下保持一致,无需操作系统(不涉及处理发送到DateTime.Parse的字符串)

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


我已经在带有.NET4的Windows 7计算机和带有.NET4.5的Windows 7计算机上确认了此行为。听起来好像一台计算机在其环境设置中检查了夏令时,而另一台没有。计算历史日期的本地时间需要.NET知道在其环境设置中的夏令时规则在该日期生效。这当然是一件非常棘手的事情,因为DST规则在不同的地区和日期有很大的差异

您的日期的UTC偏移量为-4,这使其接近美国东部时区。最相关的DST规则变化是2005年《能源政策法案》,该法案将DST的有效期从3月的第2个星期日延长至11月的第1个星期日,于2007年生效。因此,知道1998年10月31日的当地时间需要知道这项法律尚未生效

这就是区别的来源。Windows Vista是第一个拥有这些DST更改数据库的Windows版本,.NET 4是第一个开始使用它的.NET版本。XP没有那个数据库,所以.NET只能假设当前的DST规则有效


这是您在使用本地时间时需要处理的不可避免的损失。不要使用UTC。

A
DateTime
值不能表示任何任意偏移量。它只跟踪
.Kind
属性,该属性可以是
UTC
Local
未指定的

当您将没有偏移量的字符串解析为
DateTime
时,该类字符串将
未指定

当您将带有偏移量的字符串解析为
DateTime
时,该类型将为
Local
,然后将根据您提供的偏移量和根据本地时区确定的偏移量调整时间

因此,首先将
1998-10-31T00:00:00-04:00
转换为UTC
1998-10-30T20:00:00-00:00
,然后应用本地计算机的偏移量(在您的情况下,是东部夏时制-05:00),您得到的本地时间为
1998-10-30T23:00-05:00

正如Hans在回答中解释的那样,.NET2.0和WindowsXP都不能正确区分同一时区内的夏令时差异。所以无论是哪一天,你都会在东部时间04:00返回

避免所有这些废话的最佳方法是使用
DateTimeOffset
类型。它将跟踪您最初给它的偏移量,您可以在必要时对其进行转换。它存在于带有SP1的.Net 2.0中,但在.Net 3.5+(包括4.0)下,您还可以使用
TimeZoneInfo
类轻松地对其进行操作


因此,将您的代码更改为
DateTimeOffset.Parse(“1998-10-31T00:00:00-04:00”)
,您的状态会好得多。

您可以发布显示日期字符串的相关XML吗?。此外,是否所有机器都有最新的service Pack?DST信息(并非总是)随服务包一起提供。我建议您尝试使用更简单的服务来缩小问题范围。尝试只返回
DateTime
的服务调用。这将从问题中消除数据集。@johnsaunds DateTime操作在所有环境中都是正确的。我已经更新了帖子以包含新的操作和结果。@Art现在您有了通过网络发送的字符串,在客户端计算机(XP和Win7,当您尝试
Console.WriteLine(DateTime.Parse(“1998-10-31T00:00:00-04:00”)时会发生什么
?我建议您删除此问题,并开始新的问题,而不考虑web服务和序列化方面。正如我所提到的(为了清楚起见):客户端和服务器正在报告相同的时间,设置为相同的时区,并且都设置为“自动调整夏令时”。如果有其他设置需要检查,请澄清。两个客户端之间的唯一区别是操作系统。正如wal建议的,确保两个系统都已完全修补。所有系统都已完全修补ched(刚刚对其运行了Windows Update)。查看这篇博文:那篇文章涉及跨越时区的数据集;在我的示例中,服务器和客户端的时区是相同的。在两台不同的客户端机器和服务器机器上检查列的DateTimeMode会导致“UnspecifiedLocal”。这里不应该存在时区调整问题。我是assuming对于源自Windows XP核心的操作系统(如Windows Server 2003)也是如此。我是否可以强制运行在比XP更现代的配置下的.NET4不要使用此数据库并给我错误的时间?我宁愿在某些时间一贯错误,而不是正确。总之,Windows XP机器正在给我错误的时间