kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 Codeman
Codeman
Вопрос

Как преобразовать ISO8601 TimeSpan в C# TimeSpan?

Я получаю 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
37 2012-09-17T19:51:53+00:00 3
 Codeman
Codeman
Редактировал вопрос 10-го октября 2016 в 11:33
Программирование
datetime
c#
xml
parsing
xml-parsing
Решение / Ответ
 pstrjds
pstrjds
17-го сентября 2012 в 7:59
2012-09-17T19:59:01+00:00
Дополнительно
Источник
Редактировать
#17230315

Вам нужно добавить разделитель 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), недели не должны не использоваться в этих приложениях

 pstrjds
pstrjds
Редактировал ответ 9-го октября 2019 в 8:28
63
0
 millimoose
millimoose
17-го сентября 2012 в 7:59
2012-09-17T19:59:23+00:00
Дополнительно
Источник
Редактировать
#17230317

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

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

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

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

(В TimeSpan, который строится в 1.01:00:00).

10
0
Ravikumar B
Ravikumar B
17-го апреля 2018 в 5:26
2018-04-17T05:26:59+00:00
Дополнительно
Источник
Редактировать
#17230318

Пожалуйста, используйте следующий формат для 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").

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

Ravikumar B
Ravikumar B
Редактировал ответ 17-го апреля 2018 в 5:39
2
0
Похожие сообщества 6
Microsoft Stack Jobs
Microsoft Stack Jobs
2 414 пользователей
Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks
Открыть telegram
С#
С#
2 330 пользователей
Стараемся не флудить. Пишем по делу. Правила: https://t.me/professorweb/430450 Для флуда @svoboda_obsh
Открыть telegram
CODE BLOG / C#
CODE BLOG / C#
1 772 пользователей
Чат для .NET разработчиков и C# программистов. По всем вопросам: @shwanoff Youtube-канал: https://youtube.com/codeblog Основной канал: @codeblog Вконтакте: https://vk.com/codeblog Правила: https://t.me/codeblog_csharp/246972 Вакансии по тегу #work
Открыть telegram
var chat = new Chat();
var chat = new Chat();
1 428 пользователей
Обсуждение вопросов по .NET Правила чата – https://blog.devdigest.today/chat-rules Чат для флуда – https://t.me/+zwxI91RGG6s2YzAy
Открыть telegram
C#/.NET Для Новичков
C#/.NET Для Новичков
289 пользователей
Группа создана для тех, кто изучает язык программирования C#. Верховный главнокомандующий: @BlackDeveloper Оффтоп - разрешен в меру, реклама - бан.
Открыть telegram
ext
ext
31 пользователей
Общение на темы YouTube канала и программирования. Вакансии не размещаем. Основной канал: @extremecode
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 6 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией