3

У меня есть datepicker, с которой я получаю и установка даты (которая затем сериализуется в JSON с помощью json2.js, используя следующий код:Надежный метод кросс-браузер установки и получения даты в datpicker

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

к сожалению, однако, это устанавливает значение даты в datpicker к 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 из-за двусмысленности между датами США и Великобритании). Было бы неплохо, если бы это было понятно для человека, но если это имеет значение между тем, что он работает, и я бы предпочел, чтобы он работал!
+0

Поправьте меня, если я ошибаюсь, но я думал, что [GetDate] (HTTP: //jqueryui.com/demos/datepicker/#method-getDate) возвращает объект Date. Оттуда вам нужно соответствующим образом отформатировать, toString() не вариант. В будущем вы должны использовать [toISOString()] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toISOString), но прямо сейчас вам нужно использовать что-то еще, то есть использовать getUTCFullYear(), getUTCMonth() и т. д. для преобразования даты в формат ISO8601. Возможно, есть и сценарий для этого, но я не могу дать вам имя сейчас. –

+0

@ PawełDyda Да, но 'getUTCFullYear()' и т. Д. Не делают трюк - для определенных часовых поясов, которые просто дают мне вчерашнюю дату. Мне также нужно учитывать компонент времени. Я также не уверен, какой формат использовать - приведенные выше примеры относятся к ISO 8601, но я все еще вижу много проблем, анализируя их. Я мог бы написать свой собственный синтаксический анализатор даты, однако я хочу сказать, что это ** много усилий для особо простого случая использования. Должен быть лучший способ! – Justin

+0

Методы getUTC *() дают вам фактическое время в UTC. Смещение временной зоны, конечно, переносит это на другую дату/время, но это нормально, если вы не хотите иметь сегодняшнюю полночь в данном часовом поясе. В этом случае вы можете либо добавить смещение часового пояса к строке ISO8601 (вместо «Z», что означает «Zulu», то есть UTC) или использовать getFullYear(), getMinute() и т. Д., Которые дадут вам дату/время в локальном часовом поясе (в этом случае вам нужно будет добавить временное смещение). –

ответ

1

На данный момент я написал себе несколько коротких функций 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, как в противном случае в некоторых часовых поясах я в конечном итоге получить Yesterdays даты:

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

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

Поразительно ни один из следующих методов работал ВГ ан пытаясь разобрать даты в указанном выше формате:

Смежные вопросы