我的网站服务正在将一个DateTime返回给jQuery调用。该服务以以下格式返回数据:
/Date(1245398693390)/
如何将其转换为适合JavaScript的日期?
答案 0 :(得分:242)
返回的是自纪元以来的毫秒数。你可以这样做:
var d = new Date();
d.setTime(1245398693390);
document.write(d);
关于如何完全按照您的方式设置日期格式,请参阅http://www.w3schools.com/jsref/jsref_obj_date.asp上的完整Date
参考
您可以通过解析整数(as suggested here)来删除非数字:
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]));
答案 1 :(得分:77)
我一直在使用这种方法:
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);
}
}
答案 2 :(得分:33)
使用带有反向引用的String.replace解析日期字符串:
var milli = "/Date(1245398693390)/".replace(/\/Date\((-?\d+)\)\//, '$1');
var d = new Date(parseInt(milli));
答案 3 :(得分:17)
答案 4 :(得分:16)
如果您无法获取时间信息,可以尝试以下方法:
d.date = d.date.replace('/Date(', '');
d.date = d.date.replace(')/', '');
var expDate = new Date(parseInt(d.date));
答案 5 :(得分:11)
从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, ''));
答案 6 :(得分:7)
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"));
答案 7 :(得分:6)
您可以尝试像json.net这样的第三方库。项目网站上有文档。它确实说它需要.net 3.5。
否则还会有另一个名为Nii.json,我认为它是来自java的端口。我在this blog
上找到了指向它的链接答案 8 :(得分:5)
之前的答案都声明您可以执行以下操作:
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]);
答案 9 :(得分:4)
以为我会添加我一直在使用的解决方案。
如果您使用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();
2009年6月19日星期五00:04:53 GMT-0400(东部夏令时){}