Во-первых, перегрузка XmlConvert.ToDateTime(String)
равна устарела . В документации четко указано, что вы должны использовать XmlConvert.ToDateTime(String, XmlDateTimeSerializationMode)
. С его помощью вы можете указать XmlDateTimeSerializationMode
, который задокументирован следующим образом:
Одно из значений XmlDateTimeSerializationMode, которое указывает, следует ли преобразовывать дату в местное время или сохранять ее как всемирное координированное время (UTC), если это дата в формате UTC.
Если у вас есть экземпляр DateTime
, то как он был построен (например, его часовой пояс), будет потеряно. Часовой пояс будет правильно проанализирован из исходной строки и преобразован в UTC или местное время, но то, из чего он был преобразован, теряется в процессе.
Если вы хотите сохранить смещение часового пояса, используйте класс DateTimeOffset
. Он ведет себя как DateTime
, но сохраняет смещение часового пояса, из которого он был создан. XmlConvert
имеет метод ToDateTimeOffset
, который делает именно то, что вы хотите. Вот рабочий пример:
Console.WriteLine("{0,33}\t{1,33}", "Original Value", "New Value");
Console.WriteLine("{0}\t{0}", new String('-', 33));
for (int i = -12; i <= 12; i++)
{
string sign = i < 0 ? "" : "+";
string originalString = String.Format(
"2011-10-01T01:18:54.6652123{0}{1:D2}:00", sign, i);
DateTimeOffset dateTime = XmlConvert.ToDateTimeOffset(originalString);
string newString = XmlConvert.ToString(dateTime);
Console.WriteLine("{0}\t{1}", originalString, newString);
}
Единственная проблема, с которой вы сейчас столкнулись, заключается в том, что +00:00
будет сериализовано в Z
, чего можно избежать, если вы отформатируете newString
самостоятельно, например:
string newString = String.Format("{0:yyyy-MM-ddTHH:mm:ss.fffffffzzz}", dateTime);