我在Windows Azure ( http://ipredikt.com )上有一个基于预测的应用程序。据我所知,Azure的时钟是与GMT时区同步的。这是我遇到的一个问题:
假设我有一个类型为DateTime、名为CreateDate的DB字段,并将其值设置为2011年6月10日上午12:30当创建新的预测时。如果我查看一下db表,日期是正确设置的。我不会以任何方式接触或更改此值。但是,当我使用我们的API读取值时,序列化它并将其发送到客户端,我得到了一个值为2011年6月9日下午5:30的日期( API dll也位于云上,并且可能与DB并置在一起。)
我的客户端浏览器运行在太平洋时区( PST ),看起来7小时的差异是由于PST和GMT之间的差异。用于序列化该值的API代码类似于:
新串行器= System.Web.Script.Serialization.JavaScriptSerializer JavaScriptSerializer();
返回serializer.Serialize(dataObject);
这是JavaScriptSerializer对象中的一个错误,还是有什么技巧可以修复这个增量?基本上,我不希望.NET框架以任何方式干扰这个值,我只希望DB字段按原样返回。
发布于 2011-06-22 02:27:28
当你将DateTime对象传递给Azure时,它的种类等于本地。
(2011年06月10日12:30-07)
但是,当您将其保存到数据库时,区域信息将丢失。随后,当从数据库中读取此字段时,它会创建具有协调一致的区域的DateTime ( 2011年6月10日12:30 a 0)
最终,您的客户端会错误地读取日期时间。
有几个选项可以解决此问题。
1)在方法参数和数据库中,将DateTime转换为DateTimeOffset。这将保证您的本地区域(即PST)将保存在数据库中
2)使用DateTime.SpecifyKind( DateTime,DateTimeKind.Unspecified) -以这种方式,未指定DateTime的种类,并且随后按原样保存在db中。
var timeNow = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Unspecified);
serviceClient.SaveTime(timeNow);
var dateTime = serviceClient.GetTime();
发布于 2011-06-20 02:10:36
序列化的Json响应中可能包含的是“从纪元开始的毫秒”格式的日期,并且还应该包括时区信息,然后浏览器在显示与本地时区相关的日期时会考虑时区信息。
所有这些都是正确的行为,所以没有bug。看起来你并不希望这种行为发生在你的情况下。
.NET日期有一个"Kind“属性。如果未指定此项,则假定为UTC。序列化程序在序列化时应该考虑到"Kind“属性。尝试在序列化之前检查对象的此属性,并将其更改为DateTimeKind.Local。
http://msdn.microsoft.com/en-us/library/system.datetime.kind.aspx
或者,您可以在浏览器端查看自定义反序列化,在反序列化之前,您将从序列化日期中剥离时区部分。
https://stackoverflow.com/questions/6406194
复制相似问题