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

时间:2013-08-08 23:32:18

标签: javascript .net datetime asp.net-web-api json.net

数据库中的数据看起来像这样

2011-09-07 14:43:22.520

但我的Web API输出数据并用字母T

替换空格
2011-09-07T14:43:22.520

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

我也不想在最后的几毫秒。我该怎样摆脱它们?

1 个答案:

答案 0 :(得分:31)

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

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

如果您真的想要更改它,则需要实现从JsonConverter派生的自定义JSON.Net DateTimeConverterBase。我们讨论了herehere

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

var dt = new Date("2011-09-07T14:43:22.520");

但是won't work in all browsersDate在格式化方面没有很大的灵活性。因此,您可能需要考虑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"

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

另一件事 - 由于您提供的值最后没有Z,也没有-07:00之类的偏移,我认为它来自{DateTime 1}} .Kind值为DateTimeKind.Unspecified。您应该知道,当它被发送到JavaScript(或其他任何地方)时,没有关于代表什么时区的信息。 JavaScript将采用浏览器的本地时区

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

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