为什么DateTime.FromBinary在不同的机器上返回不同的DateTime值

Vic*_*aru 4 c# datetime

我发现我正在处理的应用程序有一个错误,日期时间错误地存储在我们的数据库中.我将其跟踪到DateTime.FromBinary如何操作之间的一些不一致.

我使用此代码作为测试用例:

var dateTime = DateTime.FromBinary(-8587689004854775808);
string toString = dateTime.ToString();
Run Code Online (Sandbox Code Playgroud)

在我的Windows PC(.NET 4.5,控制台应用程序)以及我的iOS应用程序(Xamarin.iOS 8.10.0.267)上,我得到以下结果:

5/27/2015 12:00:00 AM
Run Code Online (Sandbox Code Playgroud)

但是,在我们的天蓝色服务器上,它将在同一天发布,但是早上6点.

作为一个快速测试,我解雇了DotNetFiddle:

https://dotnetfiddle.net/ziBwfA

果然输出是:

5/27/2015 6:00:00 AM
Run Code Online (Sandbox Code Playgroud)

请注意,我还输出了"Kind"属性,它又以'Local'的形式返回,因此我认为这不是本地与utc的问题.

有关为什么会出现这种情况的任何想法?

And*_*ker 5

您可能DateTime在一个时区中序列化计算机,然后在另一个时区的计算机上对其进行反序列化.这在MSDN上有详细记载:

在某些情况下,方法DateTime返回的值FromBinaryDateTime提供给ToBinary 方法的原始值不同.有关详细信息,请参阅下一节"本地时间调整".

然后继续解释:

如果DateTime通过该ToBinary方法在一个时区中序列化本地对象,然后通过该方法在不同时区中反序列化,FromBinary则由结果DateTime对象表示的本地时间将自动调整为第二时区.

这似乎与您所看到的行为非常吻合.

您可能需要考虑以UTC格式存储日期(可能带有偏移量,具体取决于您的应用程序).有关存储日期和时间的最佳实践,请参阅此答案.