将.NET DateTime 转换为 JSON [重复]

Posted

技术标签:

【中文标题】将.NET DateTime 转换为 JSON [重复]【英文标题】:Converting .NET DateTime to JSON [duplicate] 【发布时间】:2010-11-04 05:58:48 【问题描述】:

可能重复:How to format a JSON date?

我的网络服务将 DateTime 返回到 jQuery 调用。服务以这种格式返回数据:

/Date(1245398693390)/

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

【问题讨论】:

见***.com/questions/206384/how-to-format-a-json-date 【参考方案1】:

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

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)));

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

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

【讨论】:

或者只是 var d = new Date(1245398693390); 这也会派上用场:var re = /-?\d+/; var m = re.exec(json_date_string); var d = new Date(parseInt(m[0])); 你是如何解析出“/Date(”并获取数字的? @Keith Substring 不进行验证,这很重要,因为即使它“总是”是那种日期格式,但现实情况是会发生变化。 (例如,有人可能会意外或故意更改服务以返回 ISO8601 日期)。使用正则表达式进行解析是处理此问题的一种快速且简单(对于程序员而言)的方法。如果您稍后处理它,那也很好,但是如果这意味着您正在执行子字符串 + 验证,那么现在您将进入多行代码(希望在一个单独的函数中),这意味着更多可能出错的事情和更多的程序员时间花费(程序员比 CPU 更昂贵)。 我还要补充一点,在 98% 以上的情况下争论这些类型操作的 CPU 时间是无关紧要的。如果您的规模如此之大以至于您需要尽可能地发挥所有性能,并且您的代码处于您已经确定使用正则表达式解析日期是最慢的操作之一的地步——KUDOS 和 micro -优化。大多数人永远不会到达那里。一般来说,降低应用程序速度的因素是 I/O 操作(数据库调用、文件操作、远程 Web 调用等),与执行琐碎和无聊的日期子字符串解析代码相比,您将获得更多的收益。 【参考方案2】:

这个方法我用了一段时间了:

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);
  

【讨论】:

我在 C#.Net4.0 中使用您的代码将 c# 日期转换为 JSON (REST),但它没有给我正确的 JS 日期转换。以下是 Json-Rest 正确转换返回的示例:c#date: 2009-09-12 00:00:00,等于 JSdate: Date(1252684800000+0800)。你的代码给了我一个值: DATE(-28800000) 这是json不接受的。你对此有什么解决方案?..谢谢 将 double 更改为格式为 ToString("#") 的字符串。在某些情况下,Double 可以返回小数并引入错误 new Date(msg) 不接受字符串。所以不要忘记 parseInt (如本页的其他答案)。【参考方案3】:

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

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

【讨论】:

在这个例子中使用正则表达式是多余的。只需使用new Date(parseInt(milli.substr(6))); 从字符串的数字部分开始解析。【参考方案4】:

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

DateTime net_datetime = DateTime.Now;

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

您可以将其转换为流动的:

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

或:

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

【讨论】:

eval 被认为是有害的。【参考方案5】:

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

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

【讨论】:

js中parseInt('1234abcd') returns 1234之后的第二个replace语句可以跳过【参考方案6】:

我认为从 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, ''));

【讨论】:

new Date(+data.replace(/\D/g, '')); 的绝招【参考方案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"));  

【讨论】:

【参考方案8】:

您可以尝试使用 3rd 方库,例如 json.net 项目网站上有文档。它确实说它需要 .net 3.5。

否则还有另一个名为 Nii.json 的文件,我相信它是来自 java 的端口。我在this blog找到了一个链接

【讨论】:

【参考方案9】:

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

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]); 

【讨论】:

我注意到这个版本提供了时区偏移:UTC .....例如:Tue Sep 20 09:44:41 EDT 2011。其他版本没有“EDT”。谢谢cowmoo。【参考方案10】:

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

如果您使用的是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(东部夏令时间)

【讨论】:

它有它的地方。我认为这是我使用它的唯一实例。至于安全问题,我想说在这种情况下没关系,因为我们不会从任何可公开更改的东西(例如查询字符串或表单字段)中提取信息。显然,任何有意图的人都可以随心所欲地使用 eval 还是不是它的客户端脚本。 除了安全问题之外,eval 效率低下,它会阻止许多 JavaScript 优化器和压缩器工作。如果您将 eval 用于 JSON 解析以外的任何内容,则可能有更好的方法。

以上是关于将.NET DateTime 转换为 JSON [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将 .NET 日期时间转换为 JSON

琐事:如何将 JSON2.org DateTime 字符串转换为 C# DateTime

如何将 DateTime .NET 数据类型转换为 W3C XML DateTime 数据类型字符串并返回?

使用 vb.net 将字符串时间/日期值转换为 dateTime 值

Pandas `read_json` 函数将字符串转换为 DateTime 对象,即使指定了 `convert_dates=False` 属性

JSON.NET 将 +00:00 时区解析为当地时间,但 Z 解析为 UTC