2016-04-01 3 views
1

Похоже, что во время преобразования время автоматически изменяется. Мой вход 17:15:25. Однако он преобразуется в 13:15:25 В чем может быть причина?DateTime.ToString() не конвертирует время

string testDate = Convert.ToDateTime("2016-03-24T17:15:25.879Z") 
         .ToString("dd-MMM-yyyy HH:mm:ss", CultureInfo.InvariantCulture); 

В результате я получаю за testDate является: 24-Mar-2016 13:15:25

+0

Вы проверили, соответствует ли полученное значение DateTime? Значение Convert.ToDateTime («2016-03-24T17: 15: 25.879Z»)? Если это неверно, это из-за ваших текущих настроек локали. – RvdK

ответ

8

Z на вашем вводе указывает время UTC, но поведение по умолчанию Convert.ToDateTime заключается в преобразовании результата в локальное время. Если вы посмотрите на результат Convert.ToDateTime("2016-03-30T17:15:25.879Z").Kind, вы увидите, что это Local.

Я предлагаю использовать DateTime.ParseExact, где вы можете указать поведение, которое хотите, например. сохраняя время UTC:

var dateTime = DateTime.ParseExact(
    "2016-03-30T17:15:25.879Z", 
    "yyyy-MM-dd'T'HH:mm:ss.FFF'Z'", 
    CultureInfo.InvariantCulture, 
    DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal); 
Console.WriteLine(dateTime);  // March 30 2016 17:15 (...) 
Console.WriteLine(dateTime.Kind); // Utc 

Вы можете затем преобразовать это значение в строку, но вы хотите.

Конечно, я действительно предлагают использовать мой Noda Time проект вместо этого, где бы разобрать либо к Instant или ZonedDateTime, который знал бы это в формате UTC ...IMO, DateTime is simply broken, именно из-за проблем, которые вы видели.

6

При использовании Convert.ToDateTime (который использует DateTime.Parse внутренне) с Z (что означает Zulu time), этот метод добавляет текущее смещение часового пояса для этого значения DateTime ,

Похоже, ваш текущий часовой пояс UTC -04: 00 прямо сейчас, и именно поэтому метод возвращает 4 часа назад.

Я хотел бы предложить использовать DateTime.ParseExact с AdjustToUniversal и AssumeUniversal стилей предотвратить Kind преобразования как Jon answered.

От AdjustToUniversal

Даты и время возвращается как координированное время (UTC). Если входная строка обозначает местное время, через спецификатор часового пояса или AssumeLocal, дата и время преобразуются с местного времени в UTC. Если входная строка обозначает время UTC, через спецификатор часового пояса или AssumeUniversal, преобразование не происходит. Если строка ввода не обозначает локальное или UTC-время, преобразование не происходит, и . В результате Kind свойство Unspecified.

+0

Я верю, что вы имеете в виду UTC -04: 00 – Ian

+0

@Ian Ups, исправлено. Спасибо :) –

+0

Отлично, без проблем. Хороший ответ. :) – Ian

0

Из-за CultureInfo.InvariantCulture. Вы конвертируете дату в вашем GMT

Convert.ToDateTime("2016-03-24T17:15:25.879Z") 

И тогда вы преобразования его в строку в инвариантной культуре

ToString("dd-MMM-yyyy HH:mm:ss",CultureInfo.InvariantCulture); 

Вы должны использовать DateTime.ParseExact, а затем использовать инвариант культуры в преобразование.

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