Как конвертировать 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
Ответы
Ответ 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")
Здесь, часть путаницы с Месяцем и Минутами имеет одну и ту же букву для обозначения, но использование обозначения делает их отдельными, чтобы их было легко понять.