Почему мое значение даты неправильно анализируется в функции веб-API?
Я посылаю от клиента к веб-функции API эту строку:
date = "Sat, 27 Oct 2012 18:10:00 GMT"
Эта функция веб-API получает строку и анализирует ее:
public HttpResponseMessage Get(DateTime date)
{
//some logic
}
В режиме отладки в функции веб-API я проверяю значение после его анализа я вижу это:
{27.10.2012 20:10}
Результат, который я выбрал для получения:
{27.10.2012 18:10:00}
Есть идеи, почему это не так?
2 ответа
Это связано с временем отправления UTC и преобразованием даты в местное время. Чтобы избежать этой и других ошибок, вам не следует отправлять datetime от вашего клиента в любом другом формате, кроме ISO 8601. Это гарантирует, что ваш клиентский код может быть повторно использован в любой локали. Это особенно верно, когда речь идет о браузерах и веб-сайтах, которые вы не можете контролировать локально установленными пользователями. Если у них установлен браузер на испанском языке es-MX
формат даты может быть день, затем месяц, а затем год, который не будет анализироваться правильно, если отправлено как обычное время даты.
ISO8601
также сохраняет смещение времени при отправке на сервер.
При отправке даты из JavaScript объект datetime содержит метод с именем .toISOString (). Вызывайте это при создании строки для отправки на сервер.
На веб-сервере вы можете использовать либо DateTime, который затем будет иметь.Kind = Utc, либо вы можете использовать DateTimeOffset
, В любом случае дата / время будут правильно реализованы, если вы отправите их в виде строки, соответствующей стандарту ISO8601.
На это также уже был дан ответ.
резюмировать
- Всегда используйте
ISO-8601
от и к клиенту (клиент обычно обрабатывается автоматически формататором JSON в Web API). - Всегда используйте
DateTimeOffset
или жеDateTime
экземпляры прямо в вашей модели.
Sat, 27 Oct 2012 18:10:00 GMT
Дата форматируется в формате всемирного координированного времени (UTC).
Значение, которое вы получаете в date
переменная такая же, но использует ваш местный часовой пояс.
Вы можете получить универсальное время от date
с помощью ToUniversalTime()
метод:
date.ToUniversalTime()