恼人的javascript时区调整问题

gar*_*ewe 9 javascript ajax json iso8601

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

{
  "myservertime": "2011-10-02T23:00+02:00"
}
Run Code Online (Sandbox Code Playgroud)

所以这就是现在的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;
        };  
Run Code Online (Sandbox Code Playgroud)

问题是当我检查控制台时,它仍然显示错误的时间......它仍然受到我的电脑时区的影响...例如,对于香港的用户,上面引用的时间会导致:

Mon Oct 03 2011 05:00:00 GMT + 0800(HKT)

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

Tom*_*icz 15

一切都很好,试试这个:

new Date(Date.parse("2011-10-02T23:00+02:00")).getUTCHours()  //21
Run Code Online (Sandbox Code Playgroud)

正确解析日期(按预期将时区考虑在内).但是当你只是打印Date.toString()它时会在当前浏览器时区显示日期(Java Date对象的一个罪恶无耻地复制到JavaScript ......)

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

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

new Date(Date.parse("2011-10-03T02:00+03:00"))  //Oct 03 01:00:00 GMT+0200
Run Code Online (Sandbox Code Playgroud)

但是UTC中的当前日期是:

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