Вопрос по javascript, json – Преобразование .NET DateTime в JSON [дубликат]
Possible Duplicate:
How to format a JSON date?
Мой веб-сервис возвращает DateTime для вызова jQuery. Служба возвращает данные в следующем формате:
/Date(1245398693390)/
Как я могу преобразовать это в удобную для JavaScript дату?
преобразование из 1970,1,1 нуждается в двойном округлении до нуля десятичных знаков, я думаю
DateTime d1 = new DateTime(1970, 1, 1);
DateTime d2 = dt.ToUniversalTime();
TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks);
return Math.Round( ts.TotalMilliseconds,0);
на стороне клиента я использую
new Date(+data.replace(/\D/g, ''));
То, что возвращается, это миллисекунды с эпохи. Вы могли бы сделать:
var d = new Date();
d.setTime(1245398693390);
document.write(d);
О том, как отформатировать дату именно так, как вы хотите, смотрите в полном объемеDate
ссылка наhttp://www.w3schools.com/jsref/jsref_obj_date.asp
Вы можете удалить нецифровые числа, проанализировав целое число (как предложено здесь):
var date = new Date(parseInt(jsonDate.substr(6)));
Или применяя следующее регулярное выражение (от Tominator в комментариях):
var jsonDate = jqueryCall(); // returns "/Date(1245398693390)/";
var re = /-?\d+/;
var m = re.exec(jsonDate);
var d = new Date(parseInt(m[0]));
Думаю, я добавлю свое решение, которое я использовал.
Если вы используетеSystem.Web.Script.Serialization.JavaScriptSerializer()
затем возвращенное время не будет зависеть от вашего часового пояса. Чтобы это исправить, вы также захотите использоватьdte.getTimezoneOffset()
чтобы вернуть его в нужное время.
String.prototype.toDateFromAspNet = function() {
var dte = eval("new " + this.replace(/\//g, '') + ";");
dte.setMinutes(dte.getMinutes() - dte.getTimezoneOffset());
return dte;
}
теперь вы просто позвоните
"/Date(1245398693390)/".toDateFromAspNet();
Fri Jun 19 2009 00:04:53 GMT-0400 (Eastern Daylight Time) {}
Если вы передаетеDateTime
из кода .Net в код JavaScript,
C #:
DateTime net_datetime = DateTime.Now;
JavaScript обрабатывает его как строку, как"/Date(1245398693390)/"
:
Вы можете преобразовать это как fllowing:
// convert the string to date correctly
var d = eval(net_datetime.slice(1, -1))
или же:
// convert the string to date correctly
va,r d = eval("/Date(1245398693390)/".slice(1, -1))
Я использовал этот метод некоторое время:
using System;
public static class ExtensionMethods {
// returns the number of milliseconds since Jan 1, 1970 (useful for converting C# dates to JS dates)
public static double UnixTicks(this DateTime dt)
{
DateTime d1 = new DateTime(1970, 1, 1);
DateTime d2 = dt.ToUniversalTime();
TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks);
return ts.TotalMilliseconds;
}
}
Предполагая, что вы разрабатываете против .NET 3.5, это прямое копирование / вставка. Вы можете иначе портировать это.
Вы можете инкапсулировать это в объект JSON или просто записать его в поток ответов.
На стороне Javascript / JSON вы конвертируете это в дату, просто передавая галочки в новый объект Date:
jQuery.ajax({
...
success: function(msg) {
var d = new Date(msg);
}
}
http://stevenlevithan.com/assets/misc/date.format.js
var date = eval(data.Data.Entity.Slrq.replace(/\/Date\((\d )\)\//gi, "new Date($1)"));
alert(date.format("yyyy-MM-dd HH:mm:ss"));
alert(dateFormat(date, "yyyy-MM-dd HH:mm:ss"));
Все предыдущие ответы утверждают, что вы можете сделать следующее:
var d = eval(net_datetime.slice(1, -1));
Однако это не работает ни в Chrome, ни в FF, потому что то, что оценивается буквально, таково:
// returns the current timestamp instead of the specified epoch timestamp
var d = Date([epoch timestamp]);
Правильный способ сделать это:
var d = eval("new " + net_datetime.slice(1, -1)); // which parses to
var d = new Date([epoch timestamp]);