我使用 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 请求不包含任何时间信息。
如果我想要数据库中存储的确切时间,我是否要求太多?
Update:
举个例子,数据库中的日期是:2009-Oct-15 22:00
没有附加时区信息。
当我在我的开发机器上调用 WebMethod 时,客户端和服务器
显然是在同一时区,来自服务器的 JSON 是:
{"d":{"TheDate":"\/Date(1255662000000)\/"}}
来自德国远程服务器的 JSON 是:
{"d":{"TheDate":"\/Date(1255636800000)\/"}}
在 Firebug 中可以看到 JSON 中有 7 小时的差异。在这
目前还没有涉及 JavaScript。
我的一个想法是 asp.net 将 TimeZone 附加到会话,但情况似乎并非如此。