Преобразование строки даты Json в объект даты JavaScript

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

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

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

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

Вышеуказанный формат даты не позволяет выполнить проверку в методе parseJSON JQuery.

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

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

Ответ 1

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

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

Я получил следующее регулярное выражение

data = data.replace(new RegExp('\\"\\\\\/Date\\((\\d{13}\\+\\d{4})\\)\\\\\/\\"', 'g'), "new Date($1)");

Ответ 2

Многократное расширение jQuery, которое автоматически сортирует даты

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

Отметьте мой пост в блоге с кодом.

Ответ 3

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

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

Ответ 4

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

Если это один объект в вашем объекте:   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));

Ответ 5

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

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

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

Вы могли:

var dateObject = new Date(new Number(yourDateVariable.replace(/(^.*\()|([+-].*$)/g, '')));