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

时间:2016-02-15 07:11:21

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

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

    // ...
}

注意小黑客 - 使用DateTimeKind of Local进入日期,尽管指定为表示UTC的'Z'。日期应始终以UTC传递,尽管理想情况下我不希望这是一个约束。我在内部使用NodaTime,仅出于遗留原因在查询和响应模型中公开DateTime。

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

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

1 个答案:

答案 0 :(得分:2)

如果您使用DateTime而不是DateTime,则会保留时区偏移量。然后,您可以直接使用它,也可以通过UtcDateTime属性将其转换为 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;
    }

    // ...
}
@JsonView(header="range")