关于javascript:将.NET日期时间转换为JSON

Converting .NET DateTime to JSON

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How to format a JSON date?

我的Web服务正在向jquery调用返回日期时间。服务返回以下格式的数据:

1
/Date(1245398693390)/

如何将其转换为一个javascript友好的日期?


返回的是自epoch以来的毫秒数。你可以这样做:

1
2
3
var d = new Date();
d.setTime(1245398693390);
document.write(d);

关于如何准确设置日期格式,请参阅http://www.w3schools.com/jsref/jsref_obj_date.asp上的完整Date参考。

您可以通过解析整数(如这里建议的那样)来除去非数字:

1
var date = new Date(parseInt(jsonDate.substr(6)));

或者应用以下正则表达式(来自注释中的tominator):

1
2
3
4
var jsonDate = jqueryCall();  // returns"/Date(1245398693390)/";
var re = /-?\d+/;
var m = re.exec(jsonDate);
var d = new Date(parseInt(m[0]));


我用这种方法已经有一段时间了:

1
2
3
4
5
6
7
8
9
10
11
12
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方面,只需将标记传递到新的日期对象中,即可将其转换为日期:

1
2
3
4
5
6
jQuery.ajax({
  ...
  success: function(msg) {
    var d = new Date(msg);
  }
}


要使用string分析日期字符串,请执行以下操作:替换为backreference:

1
2
var milli ="/Date(1245398693390)/".replace(/\/Date\((-?\d+)\)\//, '$1');
var d = new Date(parseInt(milli));


如果将.NET代码中的DateTime传递给javascript代码,C:

1
DateTime net_datetime = DateTime.Now;

javascript将其视为字符串,如"/Date(1245398693390)/"

您可以将其转换为fllowing:

1
2
// convert the string to date correctly
var d = eval(net_datetime.slice(1, -1))

或:

1
2
// convert the string to date correctly
var d = eval("/Date(1245398693390)/".slice(1, -1))


如果您在获取时间信息时遇到问题,可以尝试如下操作:

1
2
3
    d.date = d.date.replace('/Date(', '');
    d.date = d.date.replace(')/', '');  
    var expDate = new Date(parseInt(d.date));


从1970,1,1的转换需要两个四舍五入到零的小数位

1
2
3
4
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);

在我使用的客户端

1
new Date(+data.replace(/\D/g, ''));


http://stevenlevithan.com/assets/misc/date.format.js网站

1
2
3
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"));

您可以尝试使用第三方库,比如json.net,项目站点上有文档。它确实说它需要.NET 3.5。

另外还有一个叫做NII. JSON,我相信它是Java的一个端口。我在这个博客上找到了一个链接


前一个回答所有可以执行以下操作的状态:

1
var d = eval(net_datetime.slice(1, -1));

然而,这在Chrome或FF中都不起作用,因为从字面上看,得到的评价是:

1
2
// returns the current timestamp instead of the specified epoch timestamp
var d = Date([epoch timestamp]);

正确的方法是:

1
2
3
var d = eval("new" + net_datetime.slice(1, -1)); // which parses to

var d = new Date([epoch timestamp]);


我想我应该添加我一直使用的解决方案。

如果您使用的是System.Web.Script.Serialization.JavaScriptSerializer(),那么返回的时间不会特定于您的时区。要解决这个问题,您还需要使用dte.getTimezoneOffset()将其恢复到正确的时间。

1
2
3
4
5
String.prototype.toDateFromAspNet = function() {
    var dte = eval("new" + this.replace(/\//g, '') +";");
    dte.setMinutes(dte.getMinutes() - dte.getTimezoneOffset());
    return dte;
}

现在你只要打电话

1
"/Date(1245398693390)/".toDateFromAspNet();

Fri Jun 19 2009 00:04:53 GMT-0400 (Eastern Daylight Time) {}