【问题标题】:Passing DateTimeKind in ASP.NET Web Api 2.0 GET request [duplicate]在 ASP.NET Web Api 2.0 GET 请求中传递 DateTimeKind [重复]
【发布时间】:2016-02-15 07:11:21
【问题描述】:

我在 ASP.NET C# Web Api 2 项目中遇到了 DateTimes 问题。我需要在查询字符串中传递 ISO 8601 日期,如下所示:

api/resource?at=2016-02-14T23:30:58Z

我的控制器方法如下

[HttpGet("/resource")]
public IActionResult GetResource([FromQuery]DateTime? at = null)
{
    if (!at.HasValue)
    {
        at = DateTime.UtcNow;
    }
    else
    {
        at = DateTime.SpecifyKind(at.Value, DateTimeKind.Utc);
    }

    // ...
}

请注意这个小技巧 - 尽管指定了表示 UTC 的“Z”,但日期以本地 DateTimeKind 的形式出现。日期应始终以 UTC 格式传递,但理想情况下我不希望这是一个约束。我在内部使用 NodaTime,并且出于遗留原因仅在查询和响应模型中公开 DateTime。

  • 为什么我的日期被解析为本地的 DateTimeKind?

  • 如何使用 ASP.NET web api 2 从查询字符串中读取我的 UTC 日期?

【问题讨论】:

  • 如果调用 ToUniversalTime() 转换为 UTC 怎么办?
  • 在 dup 帖子中查看 my answer

标签: c# asp.net datetime asp.net-web-api2 nodatime


【解决方案1】:

如果您使用DateTimeOffset 而不是DateTime,则会保留时区偏移。然后,您可以直接使用它,也可以通过 UtcDateTime 属性将其转换为 DateTime

 DateTimeOffset dto = DateTimeOffset.Parse("2016-02-14T23:30:58Z");
 DateTime dt = dto.UtcDateTime;

[HttpGet("/resource")]
public IActionResult GetResource([FromQuery]DateTimeOffset? at = null)
{
    if (!at.HasValue)
    {
        at = DateTimeOffset.UtcNow;
    }

    // ...
}

【讨论】:

  • 感谢 Markus,这就是解决方案。仍然觉得奇怪的是,当有可用的 DateTimeKind.Utc 和各种本地时间时,DateTime 查询会简单地忽略任何时区信息,但这确实满足了这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2012-05-08
  • 1970-01-01
相关资源
最近更新 更多