Я получаю System.FormatException
, когда пытаюсь сделать следующее (в качестве примера):
TimeSpan ts = XmlConvert.ToTimeSpan("P72H");
Я'изучил ISO8601 Standard и кажется, что он правильный, но я не могу заставить его разобрать часы без выброса исключения, что бы я ни делал.
Спасибо!
EDIT:
Деталь исключения:
System.FormatException was unhandled by user code
HResult=-2146233033
Message=The string 'P72H' is not a valid TimeSpan value.
Source=System.Xml
Вам нужно добавить разделитель Time к вашей строке. Попробуйте сделать это:
TimeSpan ts = XmlConvert.ToTimeSpan("PT72H");
Смотрите спецификацию продолжительности - http://www.w3.org/TR/xmlschema-2/#duration
3.2.6.1 Лексическое представление Лексическим представлением для длительности является расширенный формат [ISO 8601] PnYn MnDTnH nMnS, где nY представляет количество лет, nM - количество месяцев, nD - количество дней, 'T' - разделитель даты и времени, nH - количество часов, nM - количество минут и nS - количество секунд. Количество секунд может включать десятичные цифры с произвольной точностью.
Правка/Обновление на основе комментариев
Поскольку возник вопрос, почему строка P2M2W5D
не будет считаться допустимым TimeSpan
, так как W
является частью стандарта ISO 8601, я хотел добавить это обновление, чтобы если кто-то столкнется с этим вопросом, ему не пришлось читать комментарии, чтобы получить ответ. Проблема, как для исходной строки P72H
, так и для P2M2W5D
заключается в том, что строка должна соответствовать W3C XML Schema (см. документацию по XmlConvert.ToTimeSpan). Когда мы смотрим на схему W3C XML Schema (ссылка выше), она ссылается на стандарт ISO 8601, в частности на раздел 5.5.3.2.1, в котором приводится причина, по которой W
не является допустимым символом в схеме XML Schema:
Поскольку недели не имеют определенной точки переноса (52 или 53), недели не должны не использоваться в этих приложениях
Вы, должно быть, что-то пропустили в стандарте. Следующее:
System.Xml.XmlConvert.ToString(TimeSpan.FromHours(12))
дает мне строку PT12H
. Таким образом, похоже, что часть времени должна быть снабжена префиксом T
. А вот следующий парсинг работает правильно:
System.Xml.XmlConvert.ToTimeSpan("PT25H")
(В TimeSpan
, который строится в 1.01:00:00
).
Пожалуйста, используйте следующий формат для System.Xml.XmlConvert.ToTimeSpan("PnYnMnDTnHnMnS")
.
P - Обозначение должно быть помещено перед форматом даты.
nY - Количество лет, например: 2Y
nM - Количество месяцев, например: 4M
nD - Количество дней, например: 6D
T - Обозначение, которое должно быть помещено перед форматом времени
nH - Количество часов, например: 8H
nM - Количество минут, например: 12M
nS - количество секунд ex: 14S
System.Xml.XmlConvert.ToTimeSpan("P2Y4M6DT8H14M18S")
.
Здесь путаница в том, что месяц и минуты обозначаются одной и той же буквой, но использование обозначения делает их отдельными, что облегчает понимание.