恼人的javascript时区调整问题

恼人的javascript时区调整问题,javascript,ajax,json,iso8601,Javascript,Ajax,Json,Iso8601,我已经设置了一个JSON端点,它从服务器返回当前时间。例如: { "myservertime": "2011-10-02T23:00+02:00" } 现在是CET的夏季时间 现在,我还有一个jQuery代码可以很好地解析它 $.sysTime = function(success) { $.ajax({ url: '/jsontimepath/', dataType: 'json',

我已经设置了一个JSON端点,它从服务器返回当前时间。例如:

{
  "myservertime": "2011-10-02T23:00+02:00"
}
现在是CET的夏季时间

现在,我还有一个jQuery代码可以很好地解析它

$.sysTime = function(success) {

            $.ajax({
                url: '/jsontimepath/',
                dataType: 'json',
                async: false,
                success: function(json){
                    sysDateTime = new Date(Date.parse(json.myservertime));
                    console.log('The system time now is: ' + sysDateTime)
                }
            });

            return sysDateTime;
        };  
问题是,当我检查控制台时,它仍然显示错误的时间。。。它仍然受我电脑时区的影响。。。例如,对于香港的用户,上述时间将导致:

2011年10月3日星期一05:00:00 GMT+0800(香港时间)


我给它一个有效的ISO8601时间字符串,它只是调整它。返回的实际时间是正确的(在该时区内)。。。但是为什么它会这样调整呢???我希望它返回CET时间而不是当地时间…

一切正常,试试这个:

new Date(Date.parse("2011-10-02T23:00+02:00")).getUTCHours()  //21
正确解析日期(按预期考虑时区)。但是,当您简单地打印
Date.toString()
时,它会显示当前浏览器时区中的日期(Java
Date
对象无耻地复制到JavaScript中的罪恶之一…)

如果您坚持使用
getUTC*()
方法系列,您将获得正确的值(如上面的示例所示)。普通的
get*()
方法总是受浏览器时区的影响(而不是从解析日期开始的时区,该时区丢失),因此通常是无用的

另一个例子:2011-10-03 02:00+03:00实际上是10月2日的23:00。但当您解析它时(我当前的浏览器时区为+0200(CEST)):

但是,UTC中的当前月份为:

new Date(Date.parse("2011-10-03T02:00+03:00")).getUTCDate()  //2 (2nd of Oct)

那么为什么不简单地将其显示为字符串,而不是解析它呢?因为我是启动另一个AJAX查询并根据该服务器日期获取一些事件的日期。所有的事件都是CEST(或CET),如果一个访问者在不同的时区,并且在该时区有新的一天,那么所有的结果都会弄乱……如果你需要保留JSON数据的原始时区偏移量,你需要自己解析该部分并单独保留。不,不要这样做。ECMA-262中指定的唯一格式是ISO 8601,其中UTC为时区,不需要解析时区信息,许多正在使用的浏览器都不会这样做。解析日期字符串的唯一可靠方法是自己动手(或使用合适的库),不要使用date.parse(或只调用date.parse的日期构造函数)。
new Date(Date.parse("2011-10-03T02:00+03:00")).getUTCDate()  //2 (2nd of Oct)