数据库中的数据看起来像这样
2011-09-07 14:43:22.520
但我的Web API输出数据并用字母T
替换空格2011-09-07T14:43:22.520
我可以在jquery中再次用空格替换字母T,但是我可以从Web API修复此问题(使web api输出原始数据吗?)
我也不想在最后的几毫秒。我该怎样摆脱它们?
答案 0 :(得分:31)
您在数据库中查看日期的方式通常无关紧要,因为它应该作为DateTime
传递到.Net - 而不是string
。 (如果将其作为varchar
存储在数据库中,则会出现更大的问题。)
ASP.Net WebAPI以ISO8601和RFC3339定义的格式返回值。这是一件好事,因为它是公认的机器可读格式。你可能不想改变它。
如果您真的想要更改它,则需要实现从JsonConverter
派生的自定义JSON.Net DateTimeConverterBase
。我们讨论了here和here。
但相反,您应该考虑如何在客户端应用程序中使用实际结果。你提到了jQuery,所以我假设你的消费者是JavaScript。在许多浏览器中,JavaScript Date
构造函数已经识别您拥有的ISO8601值,因此您可以这样做:
var dt = new Date("2011-09-07T14:43:22.520");
但是won't work in all browsers。 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"
请注意,此处的格式字符串符合moment.js,而不符合.NET。区分大小写有所不同。有关详细信息,请参阅the moment.js documentation。
另一件事 - 由于您提供的值最后没有Z
,也没有-07:00
之类的偏移,我认为它来自{DateTime
1}} .Kind
值为DateTimeKind.Unspecified
。您应该知道,当它被发送到JavaScript(或其他任何地方)时,没有关于代表什么时区的信息。 JavaScript将采用浏览器的本地时区。
如果那不是你想要的,那么你需要在你的数据库中存储UTC值,并确保它们有DateTimeKind.Utc
,以便最后序列化Z
。 JavaScript会将此规范化为浏览器的时区,但您仍然会在同一时刻讨论。
或者,您可以使用DateTimeOffset
类型 - 它将使用特定偏移量进行序列化。 JavaScript仍会将其标准化为用户的时区。