在 ASP.NET Web Api 2.0 GET 请求中传递 DateTimeKind

Passing DateTimeKind in ASP.NET Web Api 2.0 GET request

我在 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);
    }

    // ...
}

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

如果您使用 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;
    }

    // ...
}