«Неправильный» результат (как объясняет ответ darkmyst) вызван тем фактом, что 11 марта 2012 г., 2:38:58, AM не была действительной датой и временем в районах Соединенных Штатов и Канады, где наблюдается дневной свет экономия времени Очевидно, ваш код выполняется на компьютере в одной из этих областей.
Чтобы преобразовать строку в DateTime
, игнорируя любое смещение часового пояса, вы можете вызвать DateTimeOffset.Parse
и затем получить DateTime
компонент результата:
DateTime dt = DateTimeOffset.Parse("2012-03-11T02:53:58-08:00").DateTime;
string strDt = dt.ToString(); // "3/11/2012 2:53:58 AM"
ОБНОВЛЕНИЕ: Так в чем же разница между DateTime.Parse
и DateTimeOffset.Parse
, если исходная строка содержит смещение часового пояса? Рассмотрите эти два примера, которые предполагают, что ваш текущий часовой пояс - тихоокеанское время:
// Example 1: DateTime.Parse(String)
DateTime dt = DateTime.Parse("2012-03-11T06:00:00-04:00");
Console.WriteLine(dt.ToString("o")); // 2012-03-11T03:00:00.0000000-07:00
DateTime.Parse
использует смещение для настройки проанализированной даты и времени на местное время. Обратите внимание, что время изменилось с 6:00 до 3:00, что отражает переход с восточного летнего времени (UTC-04: 00) на тихоокеанское летнее время (UTC-07: 00). В вашем вопросе время изменилось, потому что DateTime.Parse
автоматически настраивает время с тихоокеанского стандартного времени (UTC-08: 00) на тихоокеанское летнее время (UTC-07: 00).
// Example 2: DateTimeOffset.Parse(String)
DateTimeOffset dto = DateTimeOffset.Parse("2012-03-11T06:00:00-04:00");
Console.WriteLine(dto.DateTime.ToString("o")); // 2012-03-11T06:00:00.0000000
Console.WriteLine(dto.Offset); // -04:00:00
DateTimeOffset.Parse
проще. Он просто возвращает значение DateTimeOffset
, свойства которого DateTime
и Offset
установлены на проанализированную дату, время и смещение. Но будьте осторожны: Если смещение часового пояса в строке не совпадает с часовым поясом, с которым вы хотите работать, то вам нужно настроить итоговую дату и время самостоятельно.