【发布时间】:2009-10-14 22:46:33
【问题描述】:
我使用 asp.net [WebMethod] 将 .net 对象推送回浏览器上的 Ajax 调用。
对象的属性之一是 DateTime 类型。
当它到达浏览器时,时间比存储在 SQL Server 中的时间早了七个小时。
好的,所以我的浏览器在秘鲁 (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-Oct-15 22:00
没有附加时区信息。
当我在客户端和服务器所在的开发机器上调用 WebMethod 时 显然在同一时区,来自服务器的 JSON 是:
{"d":{"TheDate":"\/Date(1255662000000)\/"}}
来自德国远程服务器的 JSON 是:
{"d":{"TheDate":"\/Date(1255636800000)\/"}}
在 Firebug 中看到的 JSON 有 7 小时的差异。在这 点还没有涉及到 JavaScript。
我的一个想法是 asp.net 将 TimeZone 附加到会话,但似乎并非如此。
【问题讨论】: