【问题标题】:Asp-net web api output datetime with the letter TAsp-net web api 输出带有字母 T 的日期时间
【发布时间】:2013-08-10 20:52:33
【问题描述】:

数据库中的数据如下所示

2011-09-07 14:43:22.520

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

2011-09-07T14:43:22.520

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

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

【问题讨论】:

  • "2011-09-07 14:43:22.520" 适用于 Chrome "2011-09-07T14:43:22.520" 在 FF 中抛出错误 => Date {Invalid Date} 尝试 new Date(datestring) 你会看到

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


【解决方案1】:

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

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

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

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

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 whos @987654340 @ 值为 DateTimeKind.Unspecified。您应该知道,当它被发送到 JavaScript(或其他任何地方)时,没有关于表示哪个时区的信息。 JavaScript 将假定 浏览器 的本地时区。

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

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

【讨论】:

  • 不错,全面的答案。如果可以的话,我会为向我介绍 moment.js 给予奖励 +1
猜你喜欢
  • 2013-04-25
  • 2019-01-30
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多