【问题标题】:Why is my date value parsed incorrectly in web api function?为什么我的日期值在 web api 函数中解析不正确?
【发布时间】:2016-08-10 15:03:10
【问题描述】:

我从客户端向 web api 函数发送这个字符串:

date = "Sat, 27 Oct 2012 18:10:00 GMT"

这个web api函数获取字符串并解析它:

    public HttpResponseMessage Get(DateTime date)
    {
        //some logic
    }

在 web api 函数的调试模式下,我在解析后检查值我看到:

{2012 年 10 月 27 日晚上 8:10:00}

我想要得到的结果是:

{2012 年 10 月 27 日晚上 18:10:00}

知道为什么解析错误吗?

【问题讨论】:

  • 你是怎么解析的?是否将其保存在本地时区时间而不是 UTC?
  • 您可能想发布一些代码以获得答案。
  • 解析自动在这一行计算!!!

标签: c# asp.net-web-api asp.net-mvc-5 asp.net-web-api2


【解决方案1】:

这与发送的 UTC 时间和转换为本地时间的日期有关。为避免此错误和其他错误,您不应以ISO 8601 的任何其他格式从客户端发送日期时间。这确保您的客户端代码可以在任何语言环境中重复使用。当涉及到您几乎无法控制用户安装的区域设置的浏览器和网站时,尤其如此。如果他们安装了西班牙文es-MX 的浏览器,则日期的格式可能是日、月、年,如果作为正常日期时间发送,则无法正确解析。

ISO8601 在发送到服务器时也会保留时间偏移量。

当从 JavaScript 发送日期时,datetime 对象包含一个名为 .toISOString() 的方法。在创建要发送到服务器的字符串时调用它。

然后,您可以在 Web 服务器上使用具有 .Kind = Utc 的 DateTime,也可以使用 DateTimeOffset。无论哪种方式,如果您将其作为符合 ISO8601 的字符串发送,日期/时间都会正确实现。

这也是answered before here

回顾

  • 始终在客户端之间使用ISO-8601到客户端通常由 Web API 中的 JSON 格式化程序自动处理)。
  • 始终在您的模型中直接使用 DateTimeOffsetDateTime 实例。

【讨论】:

  • 在我将其发送到服务器之前,这是来自客户端的 sigment 代码: var date = new Date(Date.parse(sensorsData[0].MeasureDate)).toISOString();
  • 如您所见,我使用 ISO。但仍然在 web api 中它没有被解析
  • var dataToSendToServer = date.toISOString();
  • date = "Sat, 27 Oct 2012 18:10:00 GMT" - 这是不是 ISO格式。 ISO 8601 将是 2012-10-27T18:10:00Z
  • 查看提供给 Wiki 的关于 ISO8601 的链接。
【解决方案2】:

Sat, 27 Oct 2012 18:10:00 GMT 日期格式为协调世界时 (UTC)

您在date 变量中收到的值相同,但使用的是您的本地时区。

您可以使用ToUniversalTime() 方法从date 获取世界时:

date.ToUniversalTime()

【讨论】:

  • web api 签名方式是否可以获取 UniversalTime?
  • @Michael:让我看看,等一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
相关资源
最近更新 更多