Pet*_*orf 7 asp.net timezone json
我使用asp.net [WebMethod]将.net对象推送回浏览器上的Ajax调用.该对象的一个属性是DateTime类型.
当它到达浏览器时,时间比存储在SQL Server中的时间早7个小时.
好的,所以我的浏览器在秘鲁(GMT-5),服务器在德国(目前是GMT + 2),这就是7小时的来源.
作为修复,我使用Ajax请求在客户端上发送UTC偏移量
d = new Date();
d.getTimezoneOffset();
Run Code Online (Sandbox Code Playgroud)
然后在服务器上我找出那里的偏移量:
// 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++;
}
Run Code Online (Sandbox Code Playgroud)
现在我可以在发送到浏览器之前修复对象中的时间字段.
我真正的问题是,序列化器如何知道7小时?
http请求不包含任何时间信息.
如果我想要存储在数据库中的确切时间,我会问得太多吗?
更新:
这是一个例子,数据库中的日期是:2009年10月15日22:00
没有附加TimeZone信息.
当我在我的开发机器上调用我的WebMethod时,客户端和服务器显然位于同一时区,服务器的JSON是:
{"d":{"TheDate":"\/Date(1255662000000)\/"}}
Run Code Online (Sandbox Code Playgroud)
德国远程服务器的JSON是:
{"d":{"TheDate":"\/Date(1255636800000)\/"}}
Run Code Online (Sandbox Code Playgroud)
在Firebug中看到的JSON相差7小时.此时尚未涉及JavaScript.
我有一个想法是asp.net将一个TimeZone附加到一个会话,但似乎并非如此.
为了回答 OP 的问题,时区信息在转换为 JSON /Date()/ 格式时是隐式的,因为它是相对于 UTC 的。例如,在我位于纽约的服务器上,如果我返回 DateTime.Parse("1/1/1970"),它会返回 /Date(18000000)/,或者 5 小时(我们现在处于 DST),这是自 1/1/1970 UTC以来的秒数,因为转换表示“嘿,纽约这里是 1/1/1970 00:00:00,所以它必须是 1/1/70 05:00:00回到格林威治。”
现在,如果加利福尼亚州的客户收到此日期表示法,并简单地实例化一个以毫秒为单位的 JavaScript 日期(例如 new Date(18000000)),则浏览器会说:“嘿,这是一个日期对象,我知道它是相对于UTC,我知道我距离格林威治有 8 小时路程,所以它一定是 1969 年 12 月 31 日 21:00:00。”
因此,这是一种非常聪明的处理时间的方法,因此它在所有时区都是“正确的”,并且所有本地化都由用户的浏览器处理。不幸的是,我们经常只处理一个原始日期,我们不想与时区相关(例如生日)。如果我们需要保持日期相同,我知道有两种方法。
第一个,正如您上面所做的那样,是调整时间(尽管我认为如果您希望它在任何时区工作,您也需要在浏览器上执行此操作)。
另一种方法是将其作为已格式化的字符串返回。这是我通常采用的方法,但我通常与美国客户合作(因此我可以返回 MM/DD/YYYY,例如,他们不会因为我是美国人而生我的气)。