我使用asp.net [WebMethod]将.net对象推送回浏览器上的Ajax调用.该对象的一个属性是DateTime类型.
当它到达浏览器时,时间比存储在SQL Server中的时间早7个小时.
好的,所以我的浏览器在秘鲁(GMT-5),服务器在德国(目前是GMT + 2),这就是7小时的来源.
作为修复,我使用Ajax请求在客户端上发送UTC偏移量
d = new Date(); d.getTimezoneOffset();
然后在服务器上我找出那里的偏移量:
// get a local time zone info TimeZoneInfo tz = TimeZoneInfo.Local; // get it in hours int offset = tz.BaseUtcOffset.Hours; // add one hour if we are in daylight savings if (tz.IsDaylightSavingTime(DateTime.Now)) { offset++; }
现在我可以在发送到浏览器之前修复对象中的时间字段.
我真正的问题是,序列化器如何知道7小时?
http请求不包含任何时间信息.
如果我想要存储在数据库中的确切时间,我会问得太多吗?
更新:
这是一个例子,数据库中的日期是:2009年10月15日22:00
没有附加TimeZone信息.
当我在我的开发机器上调用我的WebMethod时,客户端和服务器显然位于同一时区,服务器的JSON是:
{"d":{"TheDate":"\/Date(1255662000000)\/"}}
德国远程服务器的JSON是:
{"d":{"TheDate":"\/Date(1255636800000)\/"}}
在Firebug中看到的JSON相差7小时.此时尚未涉及JavaScript.
我有一个想法是asp.net将一个TimeZone附加到一个会话,但似乎并非如此.