我在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日期?
答案 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")