Я знаю, что это старо, но надеюсь, что это поможет кому-то в будущем.
Вот XML, который я десериализовал:
<timePeriod>1982-03-31T00:00:00+11:00</t
После десериализации XML я получаю 30-е, а не 31-е:
Похоже, третьи лица, которые производят этот XML (который я использую), изменяют часовой пояс на +11 во время перехода на летнее время и сохраняют его на +10, когда это не летнее время (DST).
Согласно Джону Скиту, UTC не должен учитывать DST: https://stackoverflow.com/a/5495816/495455
Также обратите внимание на документацию
Рекомендации по кодированию с использованием DateTime в .NET Framework :
Сериализатор XML всегда предполагает, что сериализованные значения DateTime представляют время локального компьютера, поэтому он применяет смещение локального часового пояса компьютера как часть смещения закодированного времени XML. Когда мы десериализовываем это на другом компьютере, исходное смещение вычитается из анализируемого значения и добавляется смещение часового пояса текущего компьютера.
Следующий код позволил мне получить дату, отформатированную как 31-е, но она не будет работать на 100% для дат без летнего времени (приведенных в этом фиде):
TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time");
DateTime easternTimeNow = TimeZoneInfo.ConvertTimeFromUtc(dataPoint.timePeriod, easternZone);
System.Diagnostics.Debug.WriteLine(easternTimeNow.ToString());
Следовательно, решение состоит в том, чтобы исправить канал XML, чтобы он не чередовал UTC с DST.
РЕДАКТИРОВАТЬ: почему данные были испорчены
Как выяснилось, это НЕ сторонний поставщик, изменяющий UTC с помощью летнего времени. Подача XML создается платформой Java Swing с чтением SQL дБ. Обычно я бы рекомендовал придерживаться стандартного представления XML (xsd: dateTime) - IS0 8601, но в этом случае использовать строку и копировать все после того, как T сработает. Отказ от ответственности, я все еще пытаюсь изменить канал, рекомендую вам НЕ делать это в PROD. Используйте на свой страх и риск !!