Дата разбирается с gmt + 2 часа

Я всегда получаю неправильную дату, когда использую var date = new Date(timestring)всегда есть +2 часа по Гринвичу.

var unsortedPlayTimes =
    [{date:'2014-08-11T09:30:00'},
        {date:'2014-08-11T08:30:00'},
        {date:'2014-08-11T08:15:00'},
        {date:'2014-08-11T08:45:00'},
        {date:'2014-08-11T12:30:00'},
        {date:'2014-08-11T10:30:00'},
        {date:'2014-08-11T11:30:00'},
        {date:'2014-08-11T07:30:00'},
        {date:'2014-08-11T13:00:00'},
        {date:'2014-08-11T23:00:00'},
        {date:'2014-08-12T00:00:00'},
        {date:'2014-08-12T01:00:00'},
        {date:'2014-08-12T05:00:00'},
        {date:'2014-08-12T09:00:00'},
        {date:'2014-08-11T14:00:00'},
        {date:'2014-08-11T18:30:00'},
        {date:'2014-08-11T13:00:00'}];

function SortandFilterPlayTimes (allPlayTimes) {
    var filteredPlayTimes = [];
    $.each(allPlayTimes, function(index, value) {
        var date = new Date(value.date);

        if ($.inArray(date,filteredPlayTimes) === -1) {
            filteredPlayTimes.push(date);
        }
    });
};

Почему JavaScript всегда добавляет это +2 часа?

3 ответа

Вы используете форматирование даты в ISO-8601, опуская часовой пояс, поэтому в ES5 при синтаксическом анализе рассматривается часовой пояс как UTC (в ES6 это будет иначе: строки в формате ISO также будут считаться локальными, когда часовой пояс не т при условии).

Если вы хотите, чтобы дата была проанализирована с вашим местным часовым поясом в ES5, вы можете изменить формат на не ISO:

var date = new Date(value.date.replace(/T/,' '));

Но вы также можете проверить, действительно ли вы хотите, чтобы дата анализировалась в зависимости от часового пояса пользователя, это чаще всего плохая идея. Обычно хорошим решением является отправка часового пояса или отправка даты в виде метки времени Unix (что вы получаете с date.getTime()).

Вы анализируете временные метки ISO-8601 без информации о часовом поясе, поэтому часовой пояс UTC предполагается, но Date.prototype.toString() предоставит строковое представление этой временной метки в вашем текущем часовом поясе, что означает, что если вы находитесь в часовом поясе UTC+2, вы заметите сдвиг на два часа.

Я предполагаю, что ваш проект размещен на сервере, который имеет разницу во времени +2 часа с вашей локальной системой, что дает вам время, которое вы не ожидаете. Ваш сервер находится в другой стране?

Другие вопросы по тегам