2015-08-20 3 views
3

Я разбор значения ISO8601 TimeSpan на некоторое время теперь, пока я не столкнулся с одним, который вызвал мой код, чтобы бросить System.FormatException:Преобразование конкретного ISO8601 TimeSpan («P2M2W5D») на C# TimeSpan

TimeSpan ts = XmlConvert.ToTimeSpan("P2M2W5D"); 

Глядя на ISO8601 Standard, кажется, что это правильный ввод, а также без каких-либо двусмысленностей (M четко указывает на месяцы, а не минуты).

System.FormatException was unhandled by user code 
HResult=-2146233033 
Message=The string 'P2M2W5D' is not a valid TimeSpan value. 
Source=System.Xml 

ответ

6

От XmlConvert.ToTimeSpan method

Параметры

s Тип: System.String

Строка для преобразования. Формат строки должен соответствовать схеме W3C XML Schema Part 2: Datatypes для продолжительности.

И Duration section

Лексическое представление длительности является [ISO 8601] расширенный формата PnYn MnDTnH nMnS, где nY представляет число лет, nM количества месяцев, nD количества дней , 'T' - дата/время разделитель, nH количество часов, количество минут и nS n количество секунд.

От ISO 8601 Date and Time Formats

В лексическом формате длительности следующие символы также используются в качестве десигнаторов и появляются как сами в лексических форматах:

  • P - используется в качестве который предшествует элементу данных, представляющему заданную продолжительность времени.
  • Y - следует за количеством лет в продолжительности.
  • M - следует количество месяцев или минут в течение продолжительности.
  • D - следует за количеством дней в продолжительности.
  • H - следует количество часов в продолжительности времени.
  • S - следует количество секунд в длительности.

Насколько я могу видеть, нет W как формат длительности в спецификации XML.

Это работает, например;

TimeSpan ts = XmlConvert.ToTimeSpan("P2M5D"); 

enter image description here

2

TimeSpan не может справиться с этим из-за указанных месяцев. TimeSpan - это всего лишь несколько тиков. Поскольку количество дней в месяце меняется, оно не может быть преобразовано в галочку.

Другая проблема заключается в том, что «W» (неделя) определена в ISO 8601, но не в спецификации XML, поэтому XmlConvert не знает об этом.

Смежные вопросы