Как мне разобрать строку формата даты UTC по местному времени? - PullRequest
2 голосов
/ 22 марта 2010

В настоящее время я использую плагин jQuery fullcalendar , но я столкнулся с проблемой летнего времени в Великобритании. После вступления в силу перехода на летнее время часы отображаются на час в противофазе.

Проблема, похоже, связана с функцией разбора плагинов. Может кто-нибудь, пожалуйста, предоставьте мне функцию для анализа строки UTC, которая включает демонизацию 'Z' в местное время даты для отображения?

Ответы [ 3 ]

1 голос
/ 22 марта 2010

Это может работать для вас:

function parseDate(value) {
    var a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);

    if (a) {
        return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));
    }

    return null;
}
1 голос
/ 22 марта 2010

После некоторой первоначальной путаницы (ответы от меня и Энди Е и, в основном, мои комментарии к его ответу), которую вы, возможно, все равно пропустили, я обнаружил, что, по-видимому, является реальной причиной вашей проблемы.

Плагин внутренне использует тот же код функции parseISO8601, который был предложен Энди Э, который был получен из Анализ даты и времени ISO 8601 W3C в JavaScript .

Но, хотя Энди Э и заявляет, что этот код работает без проблем, плагин fullcalendar, который также использует этот код, похоже, содержит ошибку.

После более внимательного изучения кода я заметил, что плагин, похоже, игнорирует часовой пояс, в котором вы находитесь.

Сравнить эти фрагменты кода

Фрагмент из исходного кода с delete.me.uk

if (d[14]) {
    offset = (Number(d[16]) * 60) + Number(d[17]);
    offset *= ((d[15] == '-') ? 1 : -1);
}

Код из fullcalendar.js

if (!ignoreTimezone) {
    if (m[14]) {
        offset = Number(m[16]) * 60 + Number(m[17]);
        offset *= m[15] == '-' ? 1 : -1;
    }
    offset -= date.getTimezoneOffset();
}

Как видите, плагин обрабатывает часовой пояс, только если для ignoreTimezone установлено значение false. Но это просто не тот случай. parseISO8601() в этом плагине всегда вызывается с ignoreTimezone, установленным в true.

Таким образом, я уверен, что ошибка связана с этим, и вам следует обратиться к автору плагина. Но сначала вы должны проверить, правильно ли анализируется дата, если вы установили ignoreTimezone в false в коде плагина

1 голос
/ 22 марта 2010

Я предполагаю, что вы имеете в виду строку даты ISO 8601 ( UTC - это стандарт времени, а не формат отображения). Я использовал эту функцию из delete.me.uk уже несколько лет в производственной среде, без проблем тестируя ее в BST / GMT (мой местный часовой пояс).

...