在 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。
为什么我的日期被解析为本地的 DateTimeKind?
如何使用 ASP.NET web api 2 从查询字符串中读取我的 UTC 日期?
如果您使用 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;
}
// ...
}
我在 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。
为什么我的日期被解析为本地的 DateTimeKind?
如何使用 ASP.NET web api 2 从查询字符串中读取我的 UTC 日期?
如果您使用 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;
}
// ...
}