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

时间:2015-05-27 19:54:58

标签: c# datetime

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

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

var dateTime = DateTime.FromBinary(-8587689004854775808);
string toString = dateTime.ToString();

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

5/27/2015 12:00:00 AM

然而,在我们的天蓝色服务器上它出现的日期相同,但是早上6点。

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

https://dotnetfiddle.net/ziBwfA

确实有输出:

5/27/2015 6:00:00 AM

请注意,我还输出了#34; Kind"财产,它回来了'本地'所以我不认为这是本地与utc的问题。

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

1 个答案:

答案 0 :(得分:5)

您可能在一个时区中序列化计算机上的DateTime,然后在另一个时区的计算机上对其进行反序列化。 This is well-documented on MSDN

  

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

然后继续解释:

  

如果DateTime方法在一个时区中序列化了本地ToBinary对象,然后通过FromBinary方法在不同时区进行反序列化,则本地时间由生成的DateTime对象会自动调整为第二个时区。

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

您可能需要考虑以UTC格式存储日期(可能带有偏移量,具体取决于您的应用程序)。有关存储日期和时间的最佳做法,请参阅this answer