将.NET DateTime转换为JSON

236 javascript datetime json

可能重复:
如何格式化JSON日期?

我的网站服务正在将一个DateTime返回给jQuery调用.该服务以以下格式返回数据:

/Date(1245398693390)/
Run Code Online (Sandbox Code Playgroud)

如何将其转换为适合JavaScript的日期?

vah*_*idg 245

返回的是自纪元以来的毫秒数.你可以这样做:

var d = new Date();
d.setTime(1245398693390);
document.write(d);
Run Code Online (Sandbox Code Playgroud)

有关如何根据需要格式化日期的信息,请参阅http://www.w3schools.com/jsref/jsref_obj_date.asp上的完整Date参考.

您可以通过解析整数来剥离非数字(如此处所示):

var date = new Date(parseInt(jsonDate.substr(6)));
Run Code Online (Sandbox Code Playgroud)

或者应用以下正则表达式(来自评论中的Tominator):

var jsonDate = jqueryCall();  // returns "/Date(1245398693390)/"; 
var re = /-?\d+/; 
var m = re.exec(jsonDate); 
var d = new Date(parseInt(m[0]));
Run Code Online (Sandbox Code Playgroud)

  • 或者只是var d = new Date(1245398693390); (37认同)
  • 这也会派上用场:var re =/ - ?\ d + /; var m = re.exec(json_date_string); var d = new Date(parseInt(m [0])); (23认同)
  • 你如何解析"/日期"(并且只是抓住数字? (6认同)

Jef*_*ang 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

假设您正在开发.NET 3.5,它是一个直接的复制/粘贴.你可以移植它.

您可以将其封装在JSON对象中,或者只是将其写入响应流.

在Javascript/JSON方面,只需将标记传递给新的Date对象,即可将其转换为日期:

jQuery.ajax({
  ...
  success: function(msg) {
    var d = new Date(msg);
  }
}
Run Code Online (Sandbox Code Playgroud)


Wil*_*Niu 33

要使用带有反向引用的String.replace来解析日期字符串:

var milli = "/Date(1245398693390)/".replace(/\/Date\((-?\d+)\)\//, '$1');
var d = new Date(parseInt(milli));
Run Code Online (Sandbox Code Playgroud)

  • 对于这个例子,使用正则表达式是过度的.只需使用`new Date(parseInt(milli.substr(6)));`开始解析字符串的数字部分. (4认同)

小智 17

如果您将DateTime.Net代码传递给javascript代码,C#:

DateTime net_datetime = DateTime.Now;
Run Code Online (Sandbox Code Playgroud)

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

您可以将其转换为fllowing:

// convert the string to date correctly
var d = eval(net_datetime.slice(1, -1))
Run Code Online (Sandbox Code Playgroud)

要么:

// convert the string to date correctly
var d = eval("/Date(1245398693390)/".slice(1, -1))
Run Code Online (Sandbox Code Playgroud)

  • `eval`被认为是有害的. (33认同)

dav*_*dem 16

如果您无法获取时间信息,可以尝试以下方法:

    d.date = d.date.replace('/Date(', '');
    d.date = d.date.replace(')/', '');  
    var expDate = new Date(parseInt(d.date));
Run Code Online (Sandbox Code Playgroud)


小智 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);
Run Code Online (Sandbox Code Playgroud)

在我使用的客户端

new Date(+data.replace(/\D/g, ''));
Run Code Online (Sandbox Code Playgroud)


小智 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"));  
Run Code Online (Sandbox Code Playgroud)


Dav*_*her 6

您可以尝试像json.net这样的第三方库 .项目网站上有文档.它确实说它需要.net 3.5.

另外还有一个名叫Nii.json的人,我相信这是一个来自java的端口.我在这个博客上找到了一个链接


小智 5

之前的答案都表明您可以执行以下操作:

var d = eval(net_datetime.slice(1, -1));
Run Code Online (Sandbox Code Playgroud)

但是,这在Chrome或FF中都不起作用,因为从字面上评估的是:

// returns the current timestamp instead of the specified epoch timestamp
var d = Date([epoch timestamp]);
Run Code Online (Sandbox Code Playgroud)

正确的方法是:

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

var d = new Date([epoch timestamp]); 
Run Code Online (Sandbox Code Playgroud)

  • `eval`被认为是有害的. (2认同)