Надежный кросс-браузерный метод установки и получения даты сборщика данных - PullRequest
3 голосов
/ 19 марта 2012

У меня есть DatePicker , с которым я получаю и устанавливаю дату (которая затем сериализуется в JSON с использованием json2.js с использованием следующего кода:

$('#element').datepicker('getDate'); // returns 2012-03-19T00:00:00.000Z
$('#element').datepicker('setDate', value);

К сожалению, однако, это устанавливает значение даты в сборщике данных на 30/08/2017 в Firefox v11 (что пока неверно, я понятия не имею, откуда оно получает это значение) и NaN/NaN/NaN в IE9.

Я попытался изменить вторую строку следующим образом:

$('#element').datepicker('setDate', new Date(value));

Это тогда работает в Firefox, но я все равно получаю тот же результат в IE9.

Затем я немного сошел с ума и начал пытаться использовать строковые манипуляции для записи и разбора дат в каком-то другом формате в надежде, что смогу надежно заставить работать простой сценарий записи / разбора, но в итоге это оказалось намного больше кода, чем я ожидал - в сочетании с тем фактом, что мне нужно принимать во внимание часовые пояса (в некоторых часовых поясах я мог бы получить что-то вроде 2012-03-18T23:00:00.000Z для 2012-03-20, то есть компонент даты указывает на предыдущую дату ) моя уверенность в настоящее время несколько поколеблена, так как важно, чтобы это работало в часовых поясах и браузерах.

Есть ли надежный способ безопасного сохранения загрузки в JSON из JSON?

  • Меня интересует только компонент даты, а не компонент времени
  • Сам формат даты на самом деле не имеет значения, поскольку он однозначно идентифицирует дату (например, я хотел бы избежать 01.01.2012 из-за неоднозначности дат США и Великобритании). Было бы неплохо, если бы он был удобочитаемым для человека, но если бы это делало разницу между его работой и не было бы лучше, чтобы оно работало!

1 Ответ

1 голос
/ 20 марта 2012

На данный момент я написал себе несколько коротких функций JavaScript для генерации и анализа строк даты в формате ISO8601 только для одной даты (например, 2012-03-20), вот они:

/**
* Parses an ISO8601 date string
*/
function parseISODate(str) {
    var dateParts = str.split('-');
    var retVal = new Date;

    retVal.setUTCFullYear(Number(dateParts[0]));
    retVal.setUTCMonth(Number(dateParts[1]) - 1);
    retVal.setUTCDate(Number(dateParts[2]));

    return retVal;
}

/**
* Gets an ISO8601 date string
*/
function iSODateString(d) {
    function pad(n) {
        return n < 10 ? '0' + n : n;
    }
    return d.getUTCFullYear() + '-'
        + pad(d.getUTCMonth() + 1) + '-'
        + pad(d.getUTCDate());
}

Кроме этого, мне также необходимо скорректировать дату, полученную мне от анализатора дат, до UTC, так как в противном случае в определенных часовых поясах я получаю дату вчерашнего дня:

var value = $('#element').datepicker('getDate');
value.setMinutes(value.getMinutes() - value.getTimezoneOffset());
return iSODateString(value); // gives me 2012-03-19

$('#element').datepicker('setDate', parseISODate(value));

Удивительно, что ни один из следующих методов не работал при попытке разобрать даты в указанном формате:

...