gpt4 book ai didi

c# - Server 2008R2 上的 .NET 4.5 的 DateTime.ToLocalTime() 行为发生变化?

转载 作者:太空狗 更新时间:2023-10-29 21:54:24 26 4
gpt4 key购买 nike

我们看到 .NET 4.5 和 System.DateTime 有奇怪的行为。与 .NET 4.0 相比,ToLocalTime() 应用于 Kind=Utc 的 DateTime 对象时,在使用 .NET 4.5 的 Server 2008R2 计算机上的行为似乎有所不同。更奇怪的是,该问题并未出现在安装了 .NET 4.5 的开发人员 PC 上。

有人对这种行为有解释吗?我无法在 Microsoft 站点上找到任何错误报告。我们可以使用更复杂的方法来转换有效的时间,但很难确保将来没有人使用 .ToLocalTime()。

开发人员 PC - Windows 7、VS2012、VS2012 安装期间安装的 .NET 4.5:

unixEpoch 621355968000000000 Utc 
asLocal1 635121441023588986 Local
asLocal2 635121441023588986 Unspecified

生产服务器 1 - 服务器 2008R2,.NET 4.0

unixEpoch 621355968000000000 Utc 
asLocal1 635121441023588986 Local
asLocal2 635121441023588986 Unspecified

生产服务器 2 - 服务器 2008R2,.NET 4.5 作为独立包安装

unixEpoch 621355968000000000 Utc
asLocal1 ***635121405023588986*** Local
asLocal2 635121441023588986 Unspecified

除了安装了 .NET 4.5 之外,生产服务器 1 和 2 是相同的。当在全局多个不同的本地时区运行时,问题就会显现。

演示问题的示例代码:

using System;
using NUnit.Framework;
namespace DateTimeToLocal
{
[TestFixture]
public class DateTimeFixture
{
private const long unixTimeInNanos = 1376561702358898611;

[Test]
public void Demonstrate()
{
DateTime unixEpoch = new DateTime(1970, 01, 01, 0, 0, 0, DateTimeKind.Utc);
DateTime utc = unixEpoch.AddTicks(unixTimeInNanos / 100);

// Method 1 - doesn't work on 2008R2 with .NET 4.5
DateTime asLocal1 = utc.ToLocalTime();

// Method 2 - works across all .NET 4.0 and .NET 4.5
TimeZoneInfo localTz = TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.StandardName);
DateTime asLocal2 = TimeZoneInfo.ConvertTimeFromUtc(utc, localTz);

Console.WriteLine("unixEpoch {0} {1}", unixEpoch.Ticks,unixEpoch.Kind);
Console.WriteLine("asLocal1 {0} {1}", asLocal1.Ticks, asLocal1.Kind);
Console.WriteLine("asLocal2 {0} {1}", asLocal2.Ticks, asLocal2.Kind);

Assert.AreEqual(asLocal1, asLocal2);
}

public static void Main(string[] args)
{
var t = new DateTimeFixture();
t.Demonstrate();

}
}
}

最佳答案

将以下修补程序应用于运行 2008R2 的服务器后,此问题就会消失:http://support.microsoft.com/kb/2863058/en-us

似乎在幕后,DateTime.ToLocalTime() 使用了一种查找技术,除非已应用该修补程序中包含的时区数据库更新,否则该技术会失败。

这非常难以追踪,而且我还没有看到任何其他网络论坛提到该数据库更新与像 utc.ToLocalTime() 这样基本的东西在 2013 年 8 月的日期失败之间的联系,离最近的由于美国东部的立法等原因而改变的边界。仍然想知道为什么在更多地方看不到这种情况?

关于c# - Server 2008R2 上的 .NET 4.5 的 DateTime.ToLocalTime() 行为发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18318114/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com