Почему JSON.stringify испортил мой объект datetime? - PullRequest
8 голосов
/ 08 февраля 2012
{ id: 1533,
  story_type_id: 1,
  content_id: 470,
  created_at: Sun, 05 Feb 2012 07:02:43 GMT,
  updated_at: Sun, 05 Feb 2012 07:02:43 GMT,
  type_name: 'post' }

У меня есть объект JSON с полем "datetime", как указано выше.Это идеально.Но когда я преобразую его в строку (я хочу сохранить его в кеше), я получаю следующий формат:

"created_at":"2012-02-05T07:02:43.000Z"

Это вызывает проблемы, потому что, когда я хочу JSON.parse, это внезапно перестает быть форматом даты и времени ион несовместим с другим моим форматом.

Что я могу сделать, чтобы решить эту проблему?Я «создал_ат» повсюду повсюду в моем приложении.Я не хочу менять каждый вручную.

Ответы [ 4 ]

14 голосов
/ 26 сентября 2013

На самом деле можно изменить способ сериализации объекта Date в JSON.В сочетании с функцией восстановления можно создать двунаправленное решение, которое будет автоматически работать при сериализации и легко использоваться при десериализации.

Сначала измените сериализацию следующим образом:

Date.prototype.toJSON = function() { return "{timestamp}+" . this.getTime() }

Это изменит представление объекта Date в метку времени UNIX с префиксом в качестве маркера:

> json = JSON.stringify({test:new Date()});
"{"test":"{timestamp}1380164268633"}"

Затем вы можете создать функцию восстановления, которая автоматически отфильтрует следующие значения:

function json_deserialize_helper(key,value) {
  if ( typeof value === 'string' ) {
    var regexp;
    regexp = /^{timestamp}(\d*)$/.exec(value);
    if ( regexp ) {
      return new Date(+regexp[1]);
    }
  }
  return value;
}

(Предоставлено: этот код был в основном скопирован из этого ответа в связанном вопросе: https://stackoverflow.com/a/14509447/2572897)

Теперь с этой настройкой десериализация нашего результата из ранее приведет к объекту Date снова:

> JSON.parse(json, json_deserialize_helper);
Object {test: Thu Sep 26 2013 04:57:48 GMT+0200 (CEST)}

Или вы можете не изменять сериализацию, а использовать регулярное выражение для перехвата стандартного формата сериализации:

function json_deserialize_helper(key,value) {
  if ( typeof value === 'string' ) {
    var regexp;
    regexp = /^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d.\d\d\dZ$/.exec(value);
    if ( regexp ) {
      return new Date(value);
    }
  }
  return value;
}

Пример:

> json = JSON.stringify({test:new Date()})
"{"test":"2013-09-26T03:05:26.563Z"}"
> JSON.parse(json, json_deserialize_helper)
Object {test: Thu Sep 26 2013 05:05:26 GMT+0200 (CEST)}
13 голосов
/ 08 февраля 2012

Не существует специального способа сериализации Date объектов в JSON.Вот почему вы получаете стандартизированное строковое представление.Вам необходимо преобразовать их обратно в Date объекты, передав их конструктору Date.

item['created_at'] = new Date(item['created_at']);

Обновление: с помощью функции reviver (см. Комментарии) вы можете получить Dateобъекты назад.

var item = JSON.parse(row, function (key, value) {
  if (key === 'created_at') {
    return new Date(value);
  } else {
    return value;
  }
});
0 голосов
/ 11 июня 2018
var date = new Date();
console.log(date);//Mon Jun 11 2018 10:14:33 GMT+0430 (Iran Daylight Time)
var json = JSON.stringify(date);
console.log(json);//"2018-06-11T05:44:33.590Z"
var dateStr = JSON.parse(json);  
console.log(dateStr);//2018-06-11T05:44:33.590Z
var date = new Date(dateStr);
console.log(date);//Mon Jun 11 2018 10:14:33 GMT+0430 (Iran Daylight Time)

https://weblog.west -wind.com / posts / 2014 / Jan / 06 / JavaScript-JSON-Date-Parsing-and-real-Dates

0 голосов
/ 14 апреля 2017

Date.prototype.toJSON = function () {возвратный момент (это) .format ('L'); }

Вы можете узнать больше о моментальной документации и типе даты, которую вы хотите вернуть.

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