Раздражающий вопрос настройки часового пояса JavaScript - PullRequest
9 голосов
/ 03 октября 2011

Я установил конечную точку 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;
        };  

Проблема в том, что когда я проверяю консоль, она по-прежнему показывает неправильное время ... На нее все еще влияет часовой пояс моего компьютера ... Например, для пользователя в Гонконге время, указанное выше, может привести к следующему:

Пн. 03.10.2011 05:00:00 GMT + 0800 (HKT)

Я даю ему правильную временную строку ISO8601, и она просто корректирует ее.Фактическое время, которое возвращается, является правильным (в этом часовом поясе) ... Но почему это настраивает это так ???Я хочу, чтобы он возвращал время CET, а не местное время ...

1 Ответ

15 голосов
/ 03 октября 2011

Все хорошо, попробуйте это:

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 фактически 23 октября 2 октября. Но когда вы его анализируете (мой текущий часовой пояс браузера +0200 (CEST)):

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

Однако текущий день месяца в UTC:

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