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