Пара вопросов здесь:
1) убедитесь, что исходная строка содержит смещение часового пояса -04: 00, поэтому оно не в формате UTC. Версия UTC для того же момента времени, очевидно, будет 2010-03-15T04: 00: 00Z (окончание Z означает UTC / Zulu). Когда вы затем отобразили DateTime, он показывает версию местного часового пояса - поскольку ваш местный часовой пояс EST (-5), то он отображается за 1 час до того, что появляется в исходной строке (которая была смещена @ -4), следовательно, 11 00 pm
2) похоже, что ваша цель здесь не в том, чтобы показать местный часовой пояс или UTC-версии временной метки, а вместо этого сохранить его с тем же смещением, которое было указано во входной строке. К счастью, 3.5 добавил тип только для такого сценария: DateTimeOffset
если бы вы использовали DateTimeOffset вместо DateTime, то вывод ToString по умолчанию был бы таким:
[342] C:\ » $dto = [datetimeoffset]::parse('2010-03-15T00:00:00-08:00')
[343] C:\ » $dto.ToString()
3/15/2010 12:00:00 AM -08:00
[344] C:\ » $dto.DateTime.ToString()
3/15/2010 12:00:00 AM
Обратите внимание, что он хранит и то же время и сведения о смещении (отсюда и название типа). Если вас не волнует смещение, и вы просто хотите получить DateTime для любого смещения, в котором был вход, вы можете просто получить свойство DateTime (как показано выше). Если вам нужно придерживаться DateTime и вы не можете или не хотите переключаться на DateTimeOffset, это может быть путь.