Как вывести javascript Date в формате json - PullRequest
4 голосов
/ 30 июня 2010

Я пытаюсь использовать график времени: 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 ()'.

Ответы [ 3 ]

4 голосов
/ 30 июня 2010

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

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

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

$json = preg_replace("/(('|\")%%|%%(\"|'))/",'', $json);
1 голос
/ 30 июня 2010

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

0 голосов
/ 06 ноября 2015
    $data = preg_replace('@new Date\(([^\)]*)\)@', '"$1"', $data);
    $data = json_decode($data, true);

Результат:

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

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