7

数据库中的数据如下所示

2011-09-07 14:43:22.520

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

2011-09-07T14:43:22.520

我可以在 jquery 中再次用空格替换字母 T,但是我可以从 Web API 解决这个问题(让 Web api 输出原始数据吗?)

我也不想要最后的毫秒数。我怎样才能摆脱它们?

4

1 回答 1

31

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

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

如果你真的想改变它,你需要实现一个自定义 JSON.Net JsonConverter,从DateTimeConverterBase. 这在此处此处进行了讨论。

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

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

但这不适用于所有浏览器。并且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。区分大小写存在差异。有关详细信息,请参阅moment.js 文档

另一件事-由于您提供的值Z末尾没有 a ,也没有诸如 之类的偏移量-07:00,因此我假设它来自DateTimewhos.KindDateTimeKind.Unspecified。您应该知道,当它被发送到 JavaScript(或其他任何地方)时,没有关于表示哪个时区的信息。JavaScript 将假定浏览器的本地时区。

如果这不是您想要的,那么您需要将 UTC 值存储在您的数据库中,并确保它们有DateTimeKind.Utc,以便它们Z在最后用 a 进行序列化。JavaScript 会将其标准化为浏览器的时区,但您仍然会谈论同一时间。

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

于 2013-08-09T00:22:48.633 回答