Подтвердить что ты не робот

Как разбирать 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

4b9b3361

Ответ 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);