Подтвердить что ты не робот

Как конвертировать ISO8601 TimeSpan в С# TimeSpan?

Я получаю System.FormatException, когда пытаюсь сделать следующее (в качестве примера):

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

Я исследовал стандарт ISO8601, и это кажется правильным, но я не могу заставить его разбирать часы, не бросая исключение, no что я делаю.

Спасибо!

ИЗМЕНИТЬ:

Подробности об исключении:

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

Ответ 1

Вам нужно добавить разделитель времени к вашей строке. Попробуйте это:

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

См. спецификацию продолжительности - http://www.w3.org/TR/xmlschema-2/#duration

3.2.6.1 Лексическое представление
Лексическое представление для продолжительности представляет собой расширенный формат [ISO8601] PnYn MnDTnH nMnS, где nY представляет количество лет, nM количество месяцев, nD количество дней, T - разделитель даты/времени, nH - число часов, нМ количество минут и нС количество секунд. Количество секунд может включать десятичные цифры с произвольной точностью.

Редактировать/обновлять на основе комментариев

Поскольку возник некоторый вопрос о том, почему строка P2M2W5D не будет считаться допустимой TimeSpan, поскольку W является частью стандарта ISO 8601, я хотел добавить это обновление, чтобы, если кто-то сталкивается с этой проблемой, он не не нужно читать комментарии, чтобы получить ответ. Проблема, как для исходной рассматриваемой строки P72H, так и P2M2W5D, заключается в том, что строка должна соответствовать XML-схеме W3C (см. документацию по XmlConvert.ToTimeSpan). Когда мы смотрим на XML-схему W3C (ссылка выше), она ссылается на стандарт ISO 8601 и, в частности, на раздел 5.5.3.2.1, в котором объясняется, почему W не является допустимым символом в схеме XML:

Поскольку недели не имеют определенной точки переноса (52 или 53), недели должны не использоваться в этих приложениях

Ответ 2

Вы, должно быть, пропустили что-то в стандарте. Следующее:

System.Xml.XmlConvert.ToString(TimeSpan.FromHours(12))

дает строку PT12H. Таким образом, кажется, что часть времени должна иметь префикс с T. И правильно выполните следующие действия:

System.Xml.XmlConvert.ToTimeSpan("PT25H")

TimeSpan, который строит на 1.01:00:00.)

Ответ 3

Пожалуйста, используйте следующий формат для System.Xml.XmlConvert.ToTimeSpan("PnYnMnDTnHnMnS").

P - Обозначение должно быть помещено перед форматом даты.

nY - количество лет, например: 2Y
нМ - Количество месяцев, например: 4М
nD - Количество дней, например: 6D

T - указатель, который должен быть помещен перед форматом времени

nH - число часов, например: 8H
нМ - Количество минут, например: 12М
nS - количество секунд, например: 14S

System.Xml.XmlConvert.ToTimeSpan("P2Y4M6DT8H14M18S")

Здесь, часть путаницы с Месяцем и Минутами имеет одну и ту же букву для обозначения, но использование обозначения делает их отдельными, чтобы их было легко понять.