У меня есть следующий объект JSON, который имеет поле даты в следующем формате:
{
"AlertDate": "\/Date(1277334000000+0100)\/",
"Progress": 1,
"ReviewPeriod": 12
}
Я хочу записать регулярное выражение или функцию для преобразования его в объект JavaScript так, чтобы это было в форме:
{
"AlertDate": new Date(1277334000000),
"Progress": 1,
"ReviewPeriod": 12
}
Вышеупомянутый формат даты приводит проверку к сбою в методе JQuery parseJSON.
Я хотел бы преобразовать 1277334000000+0100 в корректное количество миллисекунд для создания корректной даты, когда оценку называют после проверки.
Кто-либо может выручить меня с хорошим подходом к решению этого?
Мне нужен более глобальный ответ, чем просто изменение даты для отдельного свойства.
Мне нужно изменить все даты в строке JSON, а не только для одного свойства.
В итоге у меня получилось следующее регулярное выражение
data = data.replace(new RegExp('\\"\\\\\/Date\\((\\d{13}\\+\\d{4})\\)\\\\\/\\"', 'g'), "new Date($1)");
Вы действительно не должны использовать eval, если вам действительно это не нужно; Почему бы просто не иметь секунды непосредственно в JSON и не вызвать Date на этот номер, когда вам нужно отформатировать?
При необходимости можно вывести число из строки с помощью regex
Это то, что вы ищете?
Если это один из элементов вашего объекта: 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));