Matt T Heffron Ответов: 1

Как разобрать XML-строку datetime, игнорируя любую информацию о часовом поясе?


Я обновляю приложение, которое читает из XML-файла с помощью System.Xml.XmlReader и должно прочитать значение, которое является Xml-датой-временем, и сгенерировать строковое представление этого значения как местное время, без информации о часовом поясе.
Предыдущий код просто разделил строку значения атрибута на фиксированные позиции,а затем заново построил строку со строкой.Формат(). Я подумал, что это немного хрупко (и очень некрасиво).
Я изменил его на:
DateTime runDate = reader.ReadElementContentAsDateTime();
string output = runDate.ToString("MM/dd/yyyy HH:mm:ss", CultureInfo.InvariantCulture);

В моей системе (US PDT) это казалось работать отлично:
Строка даты и времени xml: 2015-02-24T10:21:42.3414491-08:00
Отдал обратно: 24.02.2015 10: 21:42
Однако: Это не unit-тесты когда они запускаются на сервере сборки интеграции, потому что этот сервер находится в разные часовые пояса.

Итак, есть ли способ разобрать строку в локальное DateTime, игнорируя часовой пояс, предпочтительно без манипуляций со строками.
Я знаю, что мог бы использовать регулярное выражение, но просто кажется неправильным не использовать DateTime в качестве промежуточной формы для данных, которые является время свидания.
---
Это довольно неприятно, потому что решение ReadElementContentAsDateTime выполнять работу в обычном случае преобразование xml происходит сразу после его генерации, в той же системе. Это просто модульные тесты сервера сборки, которые терпят неудачу.

Что я уже пробовал:

Я попробовал ReadElementContentAsString, а затем использовать XmlConvert.ToDateTime с различными значениями XmlDateTimeSerializationMode.
Не повезло.
Там просто не кажется, что есть способ разобрать игнорирующий информация о часовом поясе.

1 Ответов

Рейтинг:
1

E.F. Nijboer

Не самый красивый код, но попробуйте временно изменить текущую культуру потока и восстановить ее после этого, что-то вроде этого (кстати, Проверьте часовой пояс, код использует US-us в качестве примера)

CultureInfo currentCultureInfo = Thread.CurrentThread.CurrentCulture;
try 
{
   Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
   DateTime runDate = reader.ReadElementContentAsDateTime();
   string output = runDate.ToString("MM/dd/yyyy HH:mm:ss", CultureInfo.InvariantCulture);
} finally 
{
   Thread.CurrentThread.CurrentCulture = currentCultureInfo;
}


Удачи!

ПС. использование CultureInfo.InvariantCulture в ToString метод используется только для форматирования, а не для преобразования или чего-то еще.


Matt T Heffron

Я не думаю, что это делает то, что вы думаете.
Обе системы, с которыми я имею дело, уже имеют "en-US" CultureInfo.
Часовой пояс будет свойством системных часов.
Я не могу изменить системные часы на основе каждого потока!

E.F. Nijboer

Лучшее решение для управления датой/часами - использовать DateTimeProvider вместо DateTime.Теперь прямо. Таким образом, обычно он возвращает текущую дату и время, но для тестов у вас есть полный контроль над ним.