К сожалению, в JavaScript нет «литерала даты» (массивы могут быть выражены с помощью []
, а объекты - с {}
, но такая любовь к объектам Date отсутствует). Кроме того, действительный, действительный JSON принимает только примитивные значения (например, строки, числа, массивы, логические значения, объекты и многое другое). Вы также можете быть удивлены, узнав, что Date()
в JSON недопустим (хотя это не проблема, если вас не волнует переносимость).
Если у вас есть контроль над кодом, который создает канал и потребляет его, вы, возможно, захотите сделать одну из нескольких вещей. Сначала передайте дату как метку времени. Это достаточно просто:
var dtDateTime = new Date('Jan 27 2011 00:00:00 GMT+0000');
var intDateTime = dtDateTime.getTime();
var objJSON = {
"datetime":intDateTime
};
После загрузки JSON ваш код будет затем анализировать datetime
с:
var dtDateTime = new Date();
dtDateTime.setTime(objJson.datetime);
Здесь ваш код должен ожидать свойство datetime
и знать, как его декодировать. Так что это не очень хорошее обобщенное решение.
Еще один способ, которым я видел этот взломанный орех, - это специальный строковый литерал, который показывает вашему сценарию, что это дата и время. Может быть в значении:
var objJSON = {
"datetime":"@Jan 27 2011 00:00:00GMT+0000@"
};
Или это может быть имя:
var objJSON = {
"@datetime":1296086400000
};
@
просто выступает в качестве кода для вашего кода, что значение требует какой-то постобработки. Оба пройдут валидацию.
JSON должен быть простым и кроссплатформенным, поэтому все, что специфично для JS, изначально плохо. Если вы попытаетесь загрузить JSON, например, в Java или C #, у вас возникнет проблема.