Ответ 1
Если вы знаете, что строка определенно является датой, я предпочитаю это делать:
new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10))
Учитывая следующее представление JSON Date:
"\/Date(1221644506800-0700)\/"
Как вы десериализуете это в форме JavaScript формы даты?
Я пробовал использовать JavaScrioptSerializer MS AJAX, как показано ниже:
Sys.Serialization.JavaScriptSerializer.deserialize("\/Date(1221644506800-0700)\/")
Однако все, что я верну - это буквальная дата строки.
Если вы знаете, что строка определенно является датой, я предпочитаю это делать:
new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10))
Бертран Лерой, работавший над ASP.NET Atlas/AJAX, описал дизайн вывода DateTime JavaScriptSerializer и рассказал о происхождении таинственного ведущие и задние косые черты. Он сделал эту рекомендацию:
запустите простой поиск для "\/Date ((\ d +)) \/" и замените "новой датой ($ 1)" перед eval (но после проверки)
Я реализовал это как:
var serializedDateTime = "\/Date(1271389496563)\/";
document.writeln("Serialized: " + serializedDateTime + "<br />");
var toDateRe = new RegExp("^/Date\\((\\d+)\\)/$");
function toDate(s) {
if (!s) {
return null;
}
var constructor = s.replace(toDateRe, "new Date($1)");
if (constructor == s) {
throw 'Invalid serialized DateTime value: "' + s + '"';
}
return eval(constructor);
}
document.writeln("Deserialized: " + toDate(serializedDateTime) + "<br />");
Это очень близко к многим другим ответам:
Значение JSON - это строка, число, объект, массив, истина, ложь или нуль. Так что это всего лишь строка. Официального способа представления дат в JSON нет. Этот синтаксис является результатом реализации asp.net ajax. Другие используют формат ISO 8601.
Вы можете разобрать его так:
var s = "\/Date(1221644506800-0700)\/";
var m = s.match(/^\/Date\((\d+)([-+]\d\d)(\d\d)\)\/$/);
var date = null;
if (m)
date = new Date(1*m[1] + 3600000*m[2] + 60000*m[3]);
Регулярное выражение, используемое в методе дескрипции ASP.NET AJAX, ищет строку, которая выглядит как "/Date (1234)/" (сама строка на самом деле должна содержать кавычки и косые черты). Чтобы получить такую строку, вам нужно будет избежать символов котировки и обратной косой черты, поэтому код javascript для создания строки выглядит как "\" \/Date (1234) \/\ "".
Это будет работать.
Sys.Serialization.JavaScriptSerializer.deserialize("\"\\/Date(1221644506800)\\/\"")
Это странно, но я обнаружил, что мне пришлось сериализовать дату, а затем сериализовать строку, возвращенную из нее, а затем десериализовать на стороне клиента один раз.
Что-то вроде этого.
Script.Serialization.JavaScriptSerializer jss = new Script.Serialization.JavaScriptSerializer();
string script = string.Format("alert(Sys.Serialization.JavaScriptSerializer.deserialize({0}));", jss.Serialize(jss.Serialize(DateTime.Now)));
Page.ClientScript.RegisterStartupScript(this.GetType(), "ClientScript", script, true);
Для тех, кто не хочет использовать Microsoft Ajax, просто добавьте функцию прототипа в класс строк.
например.
String.prototype.dateFromJSON = function () {
return eval(this.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
};
Не хотите использовать eval? Попробуйте что-то простое, например
var date = new Date(parseInt(jsonDate.substr(6)));
В качестве побочного примечания я привык думать, что Microsoft вводит в заблуждение, используя этот формат. Однако спецификация JSON не очень понятна, когда дело касается определения способа описания дат в JSON.
Большое число - это стандартное время JS
new Date(1221644506800)
Ср Сен 17 2008 19:41:46 GMT + 1000 (EST)
На самом деле, momentjs поддерживает такой формат, вы можете сделать что-то вроде:
var momentValue = moment(value);
momentValue.toDate();
Это возвращает значение в формате даты javascript