Asp-net web api用字母T输出datetime

kab*_*oom 7 .net javascript datetime json.net asp.net-web-api

数据库中的数据如下所示

2011-09-07 14:43:22.520
Run Code Online (Sandbox Code Playgroud)

但我的Web API输出数据并用字母T替换空格

2011-09-07T14:43:22.520
Run Code Online (Sandbox Code Playgroud)

我可以在jquery中再次用空格替换字母T,但是我可以从Web API修复此问题(使web api输出原始数据吗?)

我也不想在最后的几毫秒.我怎么能摆脱他们?

Mat*_*int 31

您在数据库中看到日期的方式通常是无关紧要的,因为它应该作为一个DateTime- 而不是作为一个string.(如果将其存储为varchar数据库中的数据库,则会出现更大的问题.)

ASP.Net WebAPI以ISO8601RFC3339定义的格式返回值.这是一件好事,因为它是公认的机器可读格式.你可能不想改变它.

如果你真的想要改变它,你需要实现一个自定义的JSON.Net JsonConverter,派生自DateTimeConverterBase.这将在这里这里讨论.

但相反,您应该考虑如何在客户端应用程序中使用实际结果.你提到了jQuery,所以我假设你的消费者是JavaScript.在许多浏览器中,您拥有的ISO8601值已经被JavaScript Date构造函数识别,因此您可以这样做:

var dt = new Date("2011-09-07T14:43:22.520");
Run Code Online (Sandbox Code Playgroud)

但这不适用于所有浏览器.并且Date在格式化方面没有很大的灵活性.所以相反,你可能想要考虑一个像moment.js这样的库.有了这个,你可以这样做:

var m = moment("2011-09-07T14:43:22.520");
var s = m.format("YYYY-MM-DD HH:mm:ss");   // output: "2011-09-07 14:43:22"
Run Code Online (Sandbox Code Playgroud)

请注意,此处的格式字符串符合moment.js,而不符合.NET.区分大小写有所不同.有关详细信息,请参阅moment.js文档.

另一件事 - 因为你提供的值Z在最后没有a ,也没有像这样的偏移量-07:00,那么我认为它来自DateTimewhos .KindDateTimeKind.Unspecified.您应该知道,当它被发送到JavaScript(或其他任何地方)时,没有关于代表什么时区的信息.JavaScript将采用浏览器的本地时区.

如果那不是你想要的,那么你需要在你的数据库中存储UTC值,并确保它们已经在最后DateTimeKind.Utc用序列化Z.JavaScript会将此规范化为浏览器的时区,但您仍然会在同一时刻讨论.

或者,您可以使用DateTimeOffset类型 - 它将使用特定偏移量进行序列化.JavaScript仍会将此规范化为用户的时区.

  • 很好,全面的答案.如果可以的话,我会给我一个奖励+1,以便向我介绍moment.js (2认同)