Передача DateTimeKind в запрос GET ASP.NET Web Api 2.0

У меня проблемы с DateTimes в моем проекте ASP.NET C# Web Api 2. Мне нужно пройти через дату 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 Local, несмотря на то, что она указана с помощью «Z», означающего UTC. Даты всегда должны передаваться в формате UTC, хотя в идеале я бы не хотел, чтобы это было ограничением. Я использую NodaTime для внутреннего использования и раскрываю DateTime в моделях запросов и ответов только по устаревшим причинам.

  • Почему мои даты анализируются как DateTimeKind местного значения?

  • Как я могу прочитать свои даты UTC из строк запроса с помощью веб-API ASP.NET 2?


person 08Dc91wk    schedule 15.02.2016    source источник
comment
Что если вызвать ToUniversalTime() для преобразования в UTC?   -  person Ivan    schedule 15.02.2016
comment
См. мой ответ в дублирующем сообщении.   -  person Matt Johnson-Pint    schedule 19.09.2017


Ответы (1)


Если вы используете DateTimeOffset вместо 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;
    }

    // ...
}
person Markus Jarderot    schedule 15.02.2016
comment
Спасибо, Маркус, это решение. Тем не менее кажется странным, что запрос DateTime просто игнорирует любую информацию о часовом поясе, когда доступен DateTimeKind.Utc и различные местные времена, но это действительно подходит для этого. - person 08Dc91wk; 15.02.2016