我发现我正在处理的应用程序存在错误,日期时间错误地存储在我们的数据库中。我将其跟踪到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的问题。
有关为何会出现这种情况的任何想法?
答案 0 :(得分:5)
您可能在一个时区中序列化计算机上的DateTime
,然后在另一个时区的计算机上对其进行反序列化。 This is well-documented on MSDN:
在某些情况下,
DateTime
方法返回的FromBinary
值为 与提供给DateTime
的原始ToBinary
值不同 方法。有关详细信息,请参阅下一节“本地时间” 调整”。
然后继续解释:
如果
DateTime
方法在一个时区中序列化了本地ToBinary
对象,然后通过FromBinary
方法在不同时区进行反序列化,则本地时间由生成的DateTime
对象会自动调整为第二个时区。
这似乎与您所看到的行为非常吻合。
您可能需要考虑以UTC格式存储日期(可能带有偏移量,具体取决于您的应用程序)。有关存储日期和时间的最佳做法,请参阅this answer。