Как разобрать JSON для получения объекта Date в JavaScript? - PullRequest
101 голосов
/ 22 декабря 2010

У меня есть следующий фрагмент JSON:

\/Date(1293034567877)\/

, который является результатом этого кода .NET:

var obj = DateTime.Now;
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
serializer.Serialize(obj).Dump();

Теперь проблема, с которой я сталкиваюсь, заключается в том, как создатьДата объекта из этого в JavaScript.Все, что я мог найти, это невероятное решение для регулярных выражений (многие из которых содержат ошибки).

Трудно поверить, что не существует элегантного решения, поскольку все это в JavaScrip, я имею в виду код JavaScript, пытающийся прочитать JSON (JavaScript Object Notation)который должен быть кодом JavaScript, и в этот момент оказывается, что это не потому, что JavaScript не может хорошо здесь работать.

Я также видел некоторые eval-решения, которые я не мог заставить работать (кроме того, чтокак угроза безопасности).

Неужели нет способа сделать это элегантно?

Подобный вопрос без реального ответа:
Как разобрать ASP.NET JSON Формат даты с GWT

Ответы [ 17 ]

113 голосов
/ 24 января 2013

Функция JSON.parse принимает опциональную функцию Revive DateTime.Вы можете использовать такую ​​функцию, как это:

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

Затем позвоните

JSON.parse(somejsonstring,dateTimeReviver)

И ваши даты будут правильными

46 голосов
/ 22 декабря 2010

Стандартного представления дат в формате JSON не существует. Вы должны делать то, что предложил @jAndy, и вообще не сериализовать DateTime; просто отправьте строку даты RFC 1123 ToString("r") или число секунд из Unix-эпохи, или что-то еще, что вы можете использовать в JavaScript для создания Date.

44 голосов
/ 22 декабря 2010

Этот ответ от Роя Тинкера здесь :

var date = new Date(parseInt(jsonDate.substr(6)));

Как он говорит: Функция substr извлекает часть "/ Date (", а функция parseInt получаетцелое число и игнорирует ") /" в конце.Полученное число передается в конструктор Date.

Другой вариант - просто правильно отформатировать информацию на стороне ASP, чтобы JavaScript мог легко ее прочитать.Подумайте об этом для ваших дат:

DateTime.Now()

, который должен возвращать такой формат:

7/22/2008 12:11:04 PM

Если вы передадите это в конструктор JavaScript Date, например:

var date = new Date('7/22/2008 12:11:04 PM');

Переменная date теперь содержит это значение:

Tue Jul 22 2008 12:11:04 GMT-0700 (Pacific Daylight Time)

Естественно, вы можете отформатировать этот объект DateTime в любую строку / int, которую принимает конструктор JS Date.

15 голосов
/ 04 февраля 2016

если вы используете дату в формате JavaScript ISO8601 в формате JSON, вы можете использовать ее, начиная с MDN

var jsonDate = (new Date()).toJSON();
var backToDate = new Date(jsonDate);
console.log(jsonDate); //2015-10-26T07:46:36.611Z
6 голосов
/ 12 июня 2013

Вы можете конвертировать JSON Date в обычный формат даты в JavaScript.

var date = new Date(parseInt(jsonDate.substr(6)));
5 голосов
/ 22 декабря 2010

Что не так с:

new Date(1293034567877);

Это возвращает меня "ср 22 дек 2010 16:16:07 GMT + 0000 (стандартное время GMT)"

Или вам нужно получить номер из JSON?

2 голосов
/ 30 июня 2014

Я знаю, что это очень старая тема, но я хочу опубликовать это, чтобы помочь тем, кто сталкивается с этим, как я.

если вам не нужен сторонний скрипт, вы можете использовать moment, js Затем вы можете использовать .format (), чтобы отформатировать его так, как вам нужно.

2 голосов
/ 15 февраля 2016

Даты - это всегда кошмар.Отвечая на ваш старый вопрос, возможно, это самый элегантный способ:

eval(("new " + "/Date(1455418800000)/").replace(/\//g,""))

С помощью eval мы преобразуем нашу строку в код JavaScript.Затем мы удаляем «/», в функцию замены входит регулярное выражение.Когда мы начнем с нового, тогда наши предложения будут соответствовать этому:

new Date(1455418800000)

Теперь, одна вещь, которую я начал использовать давным-давно, это длинные значения, которые представлены в тиках ... почему?хорошо, локализация и перестаньте думать о том, как дата настраивается на каждом сервере или каждом клиенте.На самом деле, я тоже использую его в базах данных.

Возможно, уже довольно поздно для ответа на этот вопрос, но он может помочь кому угодно.

1 голос
/ 25 января 2016

AngularJS не удалось разобрать дату .NET JSON /Date(xxxxxxxxxxxxx)/ строка либо ..

Я решил эту проблему, отформатировав дату в строковое представление ISO 8601 вместо непосредственного сброса объекта Date ...

Вот пример кода ASP.NET MVC ..

return Json(new { 
  date : DateTime.Now.ToString("O") //ISO 8601 Angular understands this format
});

Я пытался RFC 1123, но это не работает .. Angular обрабатывает это как строку вместо даты.

return Json(new { 
  date : DateTime.Now.ToString("R") //RFC 1123 Angular won't parse this
});
0 голосов
/ 17 октября 2018

Я столкнулся с проблемой внешнего API, предоставляющего даты в этом формате, иногда даже с информацией о разнице UTC, например, /Date(123232313131+1000)/.Я смог превратить его в объект js Date со следующим кодом

var val = '/Date(123232311-1000)/';
var pattern = /^\/Date\([0-9]+((\+|\-)[0-9]+)?\)\/$/;
var date = null;

// Check that the value matches /Date(123232311-1000)/ format
if (pattern.test(val)) {
  var number = val.replace('/Date(', '',).replace(')/', '');
  if (number.indexOf('+') >= 0) {
    var split = number.split('+');
    number = parseInt(split[0]) + parseInt(split[1]);
  } else if (number.indexOf('-') >= 0) {
    var split = number.split('-');
    number = parseInt(split[0]) - parseInt(split[1]);
  } else {
    number = parseInt(number);
    date = new Date(number);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...