2016-02-15 3 views
1

У меня возникли проблемы с DateTimes в моем проекте ASP.NET C# Web Api 2. Мне нужно пройти через дату ISO 8601 в моей строке запроса следующим образом:Передача DateTimeKind в ASP.NET Web Api 2.0 Запрос GET

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

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

  • Как я могу узнать даты своего UTC из строк запроса, используя ASP.NET web api 2?

+0

Что делать, если вызову ToUniversalTime(), чтобы преобразовать в UTC? – Ivan

+0

См. [Мой ответ] (https://stackoverflow.com/a/46308876/634824) в сообщении dup. –

ответ

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; 
    } 

    // ... 
} 
+0

Спасибо, Маркус, это решение. По-прежнему кажется странным, что запрос DateTime будет просто игнорировать любую информацию о часовом поясе, когда есть доступный DateTimeKind.Utc и различные локальные времена, но это подходит для этого. – Ivan

Смежные вопросы