Как разбирать JSON для получения объекта Date в JavaScript?
У меня есть следующий фрагмент JSON:
\/Date(1293034567877)\/
который является результатом этого .NET-кода:
var obj = DateTime.Now;
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
serializer.Serialize(obj).Dump();
Теперь проблема заключается в том, как создать объект Date из этого в JavaScript.
Все, что я мог найти, было невероятным регулярным выражением (многие из которых содержат ошибки).
Трудно поверить, что нет элегантного решения, так как все это в JavaScrip, я имею в виду код JavaScript, пытающийся прочитать JSON (JavaScript Object Notation), который должен быть JavaScript-кодом, и на данный момент это не так причина, по которой JavaScript здесь не работает.
Я также видел некоторые решения eval, которые я не мог заставить работать (помимо того, что они были указаны как угроза безопасности).
Нет ли способа сделать это элегантным способом?
Аналогичный вопрос без реального ответа:
Как разобрать формат даты в формате ASP.NET JSON с помощью GWT
Ответы
Ответ 1
Нет стандартного представления дат JSON. Вы должны сделать то, что @jAndy предложил, а не сериализовать DateTime
вообще; просто отправьте строку даты RFC 1123 ToString("r")
или номер секунды от Unix-эпохи или что-то еще, что вы можете использовать в JavaScript для построения Date
.
Ответ 2
Функция 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);
И твои свидания выйдут правильно.
Ответ 3
Этот ответ от Рой Тинкер здесь:
var date = new Date(parseInt(jsonDate.substr(6)));
Как он говорит: Функция substr выдает "/Date (" part ", а функция 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
в любой тип string/int, который принимает конструктор JS Date
.
Ответ 4
если вы используете дату ISO8601 стиля JavaScript в JSON, вы можете использовать это, от MDN
var jsonDate = (new Date()).toJSON();
var backToDate = new Date(jsonDate);
console.log(jsonDate); //2015-10-26T07:46:36.611Z
Ответ 5
Что случилось с:
new Date(1293034567877);
Это вернется для меня "Wed Dec 22 2010 16:16:07 GMT + 0000 (GMT Standard Time)".
Или вам нужно получить номер json?
Ответ 6
Вы можете конвертировать JSON Date в обычный формат даты в JavaScript.
var date = new Date(parseInt(jsonDate.substr(6)));
Ответ 7
Я знаю, что это очень старый поток, но я хочу опубликовать его, чтобы помочь тем, кто сталкивается с этим, как я.
если вам не нужно использовать сторонний script, вы можете использовать moment, js
Затем вы можете использовать .format(), чтобы отформатировать его на все, что вы хотите.
Ответ 8
Даты всегда кошмары. Отвечая на ваш старый вопрос, возможно, это самый элегантный способ:
eval(("new " + "/Date(1455418800000)/").replace(/\//g,""))
С eval мы преобразуем нашу строку в код javascript. Затем мы удаляем "/", в функцию замены - регулярное выражение. Поскольку мы начинаем с нового, то наши предложения будут отменять это:
new Date(1455418800000)
Теперь, одна вещь, которую я начал использовать давно, - это длинные ценности, которые представлены в тиках... почему? ну, локализация и перестать думать о том, как настроена дата на каждом сервере или на каждом клиенте. Фактически, я тоже использую его в базах данных.
Возможно, это довольно поздно для этого ответа, но может помочь кому угодно.
Ответ 9
AngularJS не смог разобрать .NET JSON date /Date(xxxxxxxxxxxxx)/
string..
I я поставил эту проблему, отформатировав дату на свое строковое представление ISO 8601, вместо того, чтобы напрямую сбрасывать объект Date
...
Вот пример кода ASP.NET MVC.
return Json(new {
date : DateTime.Now.ToString("O") //ISO 8601 Angular understands this format
});
Я пробовал RFC 1123
, но он не работает. Angular рассматривает это как строку вместо Date.
return Json(new {
date : DateTime.Now.ToString("R") //RFC 1123 Angular won't parse this
});
Ответ 10
Я не использовал .Net для таких вещей. Если вы смогли заставить его напечатать что-то вроде следующего, оно должно работать.
Обратите внимание, что если вы не разбираете эту строку JSON другими средствами или только ожидаете, что у пользователей будут современные браузеры со встроенным анализатором JSON, вам нужно использовать JS-структуру или JSON2 для анализа строки JSON, выводимой сервером, в реальный объект JSON.
// JSON received from server is in string format
var jsonString = '{"date":1251877601000}';
//use JSON2 or some JS library to parse the string
var jsonObject = JSON.parse( jsonString );
//now you have your date!
alert( new Date(jsonObject.date) );
Wiki Link
Современные браузеры, такие как Firefox 3.5 и Internet Explorer 8, включают специальные функции для разбора JSON. Поскольку поддержка собственных браузеров более эффективна и безопасна, чем eval(), ожидается, что встроенная поддержка JSON будет включена в следующий стандарт ECMAScript. [6]
Ссылка на файл JSON2
Живой пример
Ответ 11
Ответ на этот вопрос: используйте nuget для получения JSON.NET, затем используйте его внутри вашего метода JsonResult
:
JsonConvert.SerializeObject(/* JSON OBJECT TO SEND TO VIEW */);
внутри вашего представления просто сделайте это в javascript
:
JSON.parse(/* Converted JSON object */)
Если это вызов ajax:
var request = $.ajax({ url: "@Url.Action("SomeAjaxAction", "SomeController")", dataType: "json"});
request.done(function (data, result) { var safe = JSON.parse(data); var date = new Date(safe.date); });
Как только JSON.parse
был вызван, вы можете поместить дату JSON в экземпляр new Date
, потому что JsonConvert
создает соответствующий экземпляр времени ISO
Ответ 12
function parseJsonDate(jsonDate) {
var fullDate = new Date(parseInt(jsonDate.substr(6)));
var twoDigitMonth = (fullDate.getMonth() + 1) + ""; if (twoDigitMonth.length == 1) twoDigitMonth = "0" + twoDigitMonth;
var twoDigitDate = fullDate.getDate() + ""; if (twoDigitDate.length == 1) twoDigitDate = "0" + twoDigitDate;
var currentDate = twoDigitMonth + "/" + twoDigitDate + "/" + fullDate.getFullYear();
return currentDate;
};
Ответ 13
Как сказал Каллум, для меня лучший способ - изменить метод Controller на строку вместо JsonResult ".
public string GetValues()
{
MyObject.DateFrom = DateTime.Now;
return JsonConvert.SerializeObject(MyObject);
}
Из метода ajax вы можете сделать что-то вроде этого
$.ajax({
url: "/MyController/GetValues",
type: "post",
success: function (data) {
var validData = JSON.parse(data);
//if you are using datepicker and you want set a format
$("#DateFrom").val($.datepicker.formatDate("dd/mm/yy", new Date(validData.DateFrom)));
// if you want the date as returned
$("#DateFrom").val(new Date(validData.DateFrom))
}
});
Ответ 14
Использование функции eval-функции просто необходимо удалить переднюю косую черту спереди и сзади.
var date1 = "/Date(25200000)/"
eval("new " + date1.substring(1, date1.length - 1));
дает Thu Jan 01 1970 00:00:00 GMT-0700 (стандартное время в США)
Ответ 15
Я столкнулся с проблемой внешнего 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);
}
}
Ответ 16
//
// formats a .net date into a javascript compatible date
//
function FormatJsonDate(jsonDt)
{
var MIN_DATE = -62135578800000; // const
var date = new Date(parseInt(jsonDt.substr(6, jsonDt.length-8)));
return date.toString() == new Date(MIN_DATE).toString() ? "" : (date.getMonth() + 1) + "\\" + date.getDate() + "\\" + date.getFullYear();
}
Ответ 17
function parseJsonDate(jsonDate) {
var fullDate = new Date(parseInt(jsonDate.substr(6)));
var twoDigitMonth = (fullDate.getMonth() + 1) + ""; if (twoDigitMonth.length == 1) twoDigitMonth = "0" + twoDigitMonth;
var twoDigitDate = fullDate.getDate() + ""; if (twoDigitDate.length == 1) twoDigitDate = "0" + twoDigitDate;
var currentDate = twoDigitMonth + "/" + twoDigitDate + "/" + fullDate.getFullYear();
return currentDate;
};
//Используйте эту функцию
var objDate=parseJsonDate("\/Date(1443812400000)\/");
alert(objDate);