Преобразовать строку даты Json в объект даты JavaScript - PullRequest
13 голосов
/ 23 июня 2010

У меня есть следующий объект JSON, который имеет поле даты в следующем формате:

{
    "AlertDate": "\/Date(1277334000000+0100)\/",
    "Progress": 1,
    "ReviewPeriod": 12 
}

Я хочу написать регулярное выражение или функцию для преобразования его в объект javascript, чтобы он находился вформа:

{
    "AlertDate": new Date(1277334000000),
    "Progress": 1,
    "ReviewPeriod": 12 
}

Приведенный выше формат даты не проходит проверку в методе JQuery parseJSON.

Я хотел бы преобразовать 1277334000000 + 0100 в правильное количество миллисекунд для создания правильной датыкогда eval вызывается после проверки.

Может кто-нибудь помочь мне с хорошим подходом к решению этой проблемы?

Ответы [ 5 ]

1 голос
/ 27 декабря 2010

Повторно используемое расширение jQuery, которое автоматически анализирует даты

Я написал расширение jQuery (если вы его используете, и я надеюсь / рекомендую вам это сделать), которое изменяет функциональность $ .parseJSON (), чтобы оноавтоматически разбирать даты для вас.Больше нет необходимости в повторяющемся коде для разбора даты.

Проверьте мое сообщение в блоге с кодом.

0 голосов
/ 18 февраля 2012

Здравствуйте, я просто хочу добавить в BalusC ответ:

Если вы хотите, чтобы даты не были неопределенными для определенных более старых дат вместо

json.AlertDate = new Date(parseInt(json.AlertDate.replace(/(^.*\()|([+-].*$)/g, '')));

Вы могли бы:

var dateObject = new Date(new Number(yourDateVariable.replace(/(^.*\()|([+-].*$)/g, '')));
0 голосов
/ 23 июня 2010

Это то, что вы ищете?

Если это один элемент в вашем объекте: o = { «AlertDate»: «/ Дата (1277334000000 + 0100) /», «Прогресс»: 1, "ReviewPeriod": 12 }

Этот код извлечет первое значение числа (игнорируя «+0100»), преобразует его в число и создает объект даты.

var rxFirstNumber = /(\d+)/;
var strAlertDate = o.AlertDate;
var arrMatches,intTimeStamp;

arrMatches = strAlertDate.match(rxFirstNumber);
if (arrMatches !== null && arrMatches.length > 0) {
    intTimeStamp = parseInt(arrMatches[1],10);
    o.AlertDate = new Date(intTimeStamp);
}

Если вы можете доверять своим данным, чтобы они всегда содержали эти строковые данные (или, по крайней мере, AlertDate всегда будет строкой, содержащей число), это можно выразить одной строкой (неприятного и не поддерживаемого) кода:

o.AlertDate = new Date(parseInt(o.AlertDate.match(/(\d+)/)[1],10));
0 голосов
/ 23 июня 2010

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

Мне нужно изменить все даты в строке JSON, а не только в одном свойстве.

Iзакончилось следующим регулярным выражением

data = data.replace(new RegExp('\\"\\\\\/Date\\((\\d{13}\\+\\d{4})\\)\\\\\/\\"', 'g'), "new Date($1)");
0 голосов
/ 23 июня 2010

Вы действительно не должны использовать eval, если вам действительно не нужно;почему бы просто не иметь секунд непосредственно в JSON и вызывать Date для этого числа, когда вам нужно отформатировать?

Если вам нужно, вы можете разобрать номер из строки с помощью регулярного выражения

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