Как вывести дату javascript в json

Я пытаюсь использовать график временной шкалы: http://code.google.com/apis/visualization/documentation/gallery/annotatedtimeline.html#Data_Format Данные поступают в виде фида JSON.

Google хочет, чтобы данные были примерно такими:

    {
   version:'0.6',
   reqId:'0',
   status:'ok',
   sig:'4641982796834063168',
   table:{
      cols:[
         {
            id:'A',
            label:'NEW A',
            type:'string'
         },
         {
            id:'B',
            label:'B-label',
            type:'number'
         },
         {
            id:'C',
            label:'C-label',
            type:'datetime'
         }
      ],
      rows:[
         {
            c:[
               {
                  v:'c'
               },
               {
                  v:3.0,
                  f:'3'
               },
               {
                  v:new Date(2008,
                  3,
                  30,
                  0,
                  31,
                  26                  ),
                  f:'4/30/08 12:31 AM'
               }
            ]
         }
      ]
   }
}

Как я могу вывести функцию Date, не заключая ее в разделители строк, такие как Date ().


person Keyo    schedule 30.06.2010    source источник
comment
Поскольку это связано с диаграммами Google, я обнаружил, что они разрешают строку даты в формате Date (yyyy, mm, dd [, hh, ss, ii]). Требуемые диаграммы json недопустимы, потому что они используют разные кавычки.   -  person Keyo    schedule 30.06.2010
comment
Да, это работает! и это самое простое решение. т.е. просто удалите слово «новый». Keyo Где вы узнали строку Date specified? Я не вижу его в Charts API? (Хотелось бы узнать, будет ли он официальным и останется).   -  person scipilot    schedule 21.09.2014


Ответы (3)


Я просто заключил функции в символы %% следующим образом:

$something = array('%%new Date(...) %%','somevalue');
$json = json_encode($something);

И удалили эти символы %% и разделители строк рядом с ними.

$json = preg_replace("/(('|\")%%|%%(\"|'))/",'', $json);
person Keyo    schedule 30.06.2010
comment
Обратите внимание, что это будет работать только в очень узком сценарии использования. Некоторые люди могут оказаться здесь, которые хотят передавать JS в JSON через ajax и т. Д. Обратите внимание, что передача js в JSON не будет а) работать по умолчанию (вам нужно будет оценить ответ) и б) это не предназначено для использования как что. Здесь можно использовать предлагаемое решение, только если оно используется в выводе файла ресурсов / тега сценария javascript. - person Manuel Arwed Schmidt; 10.03.2017

К сожалению, в 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 #, у вас возникнут проблемы.

person Andrew    schedule 30.06.2010

    $data = preg_replace('@new Date\(([^\)]*)\)@', '"$1"', $data);
    $data = json_decode($data, true);

Результат:

новая дата (2008,3,30,0,31,26) => "2008,3,30,0,31,26"

person Amir Hosseinzadeh    schedule 06.11.2015