Да, действительно, забавно.
Посмотрел в исходники — там хитрый pattern matching.
После сопоставления по формату происходит проверка диапазонов, если не попали — считаем вариант матчинга неуспешным и переходим к следующему.
Сделано это потому, что один формат может иметь несколько смыслов.
Богатое поле распахали для скрытых багов.
if (inv)
{
if (raw.FullHMSMatch(TimeSpanFormat.PositiveInvariantFormatLiterals))
{
positive = true;
match = TryTimeToTicks(positive, zero, raw._numbers0, raw._numbers1, raw._numbers2, zero, out ticks); // Вот это сопоставление не проходит, так как _numbers0 >= 24
overflow = overflow || !match;
}
if (!match && raw.FullDHMMatch(TimeSpanFormat.PositiveInvariantFormatLiterals))
{
positive = true;
match = TryTimeToTicks(positive, raw._numbers0, raw._numbers1, raw._numbers2, zero, zero, out ticks); // Поэтому идём сюда. В этом формате те же разделители и то же количество элементов, отличие только в их числовом значении
overflow = overflow || !match;
}
...
}
private static bool TryTimeToTicks(bool positive, TimeSpanToken days, TimeSpanToken hours, TimeSpanToken minutes, TimeSpanToken seconds, TimeSpanToken fraction, out long result)
{
if (days._num > MaxDays ||
hours._num > MaxHours ||
minutes._num > MaxMinutes ||
seconds._num > MaxSeconds ||
!fraction.NormalizeAndValidateFraction())
{
result = 0;
return false;
}
...
return true;
}
24 дня
B>ШТА?!! Какой ещё "диапазон" может быть у ИНТЕРВАЛА времени? Он же бесконечен!
Парсинг умеет не только формат чч:мм:сс, но и дд:чч:мм и вот так пытается предположить в каком формате задана исходная строка.
Не нравится — явно указывай какой формат нужен и не заставляй код автоподбором заниматься.
Здравствуйте, karbofos42, Вы писали:
K>Здравствуйте, Baiker, Вы писали: B>>ШТА?!! Какой ещё "диапазон" может быть у ИНТЕРВАЛА времени? Он же бесконечен!
K>Парсинг умеет не только формат чч:мм:сс, но и дд:чч:мм
Да? А варить кофе и макраме он не умеет? Неужели кретин, писавший код, не понимает, что надо не ДОГАДЫВАТЬСЯ (что очевидно, расстановка "временных бомб"), а использовать ОДИН формат по-умолчанию, а остальные указывать явно? Догадывальщики, ёпть.... "что-где-какгду" нашли!
И я не услышал ответа, почему я не могу распарсить интервал "сто минут"? ("0:100:00") Это что, что-то необычное для ИНТЕРВАЛА времени?
If the s argument is not a day value only, it must include an hours and a minutes component; other components are optional.
If they are present, the values of each time component must fall within a specified range.
For example, the value of hh, the hours component, must be between 0 and 23.
Because of this, passing "23:00:00" to the Parse method returns a time interval of 23 hours.
On the other hand, passing "24:00:00" returns a time interval of 24 days.
Because "24" is outside the range of the hours component, it is interpreted as the days component.
Здравствуйте, karbofos42, Вы писали:
B>>ШТА?!! Какой ещё "диапазон" может быть у ИНТЕРВАЛА времени? Он же бесконечен! K>Парсинг умеет не только формат чч:мм:сс, но и дд:чч:мм
Отсюда интересный вопрос — что это за формат такой интересный, дд:чч:мм, и кто его использует.
Все вменяемые люди напишут 24d, а не 24:00:00.
Здравствуйте, Baiker, Вы писали:
V>>После сопоставления по формату происходит проверка диапазонов...
B>ШТА?!! Какой ещё "диапазон" может быть у ИНТЕРВАЛА времени? Он же бесконечен!
Диапазон у номера часа в сутках бесконечен?
Здравствуйте, Baiker, Вы писали:
B>Да? А варить кофе и макраме он не умеет? Неужели кретин, писавший код, не понимает, что надо не ДОГАДЫВАТЬСЯ (что очевидно, расстановка "временных бомб"), а использовать ОДИН формат по-умолчанию, а остальные указывать явно? Догадывальщики, ёпть.... "что-где-какгду" нашли!
Подавляющее большинство парсинга в .NET зависит от локали и нет там никакого формата по умолчанию.
Не нужно, чтобы метод перебирал все возможные форматы — нужно его явно задавать.
Так уж повелось в .NET
B>И я не услышал ответа, почему я не могу распарсить интервал "сто минут"? ("0:100:00") Это что, что-то необычное для ИНТЕРВАЛА времени?
Потому что так реализовали класс и так указано в документации. Почему такое решение выбрали — разработчики передо мной не отчитывались.
Это логично для TimeOnly, а для TimeSpan решение выглядит странным.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Отсюда интересный вопрос — что это за формат такой интересный, дд:чч:мм, и кто его использует. НС>Все вменяемые люди напишут 24d, а не 24:00:00.
Я встречал только д.чч:мм:сс, д.чч и т.п.
т.е. когда дни отделяются точкой, а не двоеточием
Может где-то за бугром такое активно используют, а то кому-то и формат мм/дд/гггг кажется странным и он не понимает чего это у него 10/10/2020 работало, а 20/10/2020 вылетает.
Здравствуйте, karbofos42, Вы писали:
K>Я встречал только д.чч:мм:сс, д.чч и т.п. K>т.е. когда дни отделяются точкой, а не двоеточием K>Может где-то за бугром такое активно используют,
А может и нет.
K>а то кому-то и формат мм/дд/гггг кажется странным и он не понимает чего это у него 10/10/2020 работало, а 20/10/2020 вылетает.
Здравствуйте, karbofos42, Вы писали:
B>>И я не услышал ответа, почему я не могу распарсить интервал "сто минут"? ("0:100:00") Это что, что-то необычное для ИНТЕРВАЛА времени?
K>Потому что так реализовали класс и так указано в документации
Ну так мы здесь спорим не о том, зачем дурак левый лапоть на правое ухо надел! Мы пытаемся понять, возможно был какой-то ГЛУБИННЫЙ СМЫЛ? Но как всегда, объяснение оказалось простое — тупость разрабов. Нет, не "маленький опыт", а именно тупость! Потому что наверняка БЫЛИ СПОРЫ по этому поводу, но решили всё сделать максимально простым (для себя) методом.
Итак, библиотека в очередной раз подкладывает свои тупые грабли, а мы по ним бегаем благодаря "специально отобранной" команде MS team!
Здравствуйте, _NN_, Вы писали:
_NN>For example, the value of hh, the hours component, must be between 0 and 23.
Тогда вдвойне стоеросовый му****к тот, кто назвал это TimeSpan! Это надо называть 24H_Span или OneDaySpan! Тогда все ограничения на "0...23" являются логичными.
А вот уже НОРМАЛЬНЫЙ TimeSpan должен парсить всё, вплоть до "200 секунд, 10000000 миллисекунд". Жизнь — она богаче, чем думает макак, уныло сидящий в офисе MS. Задачи настолько разные, что надо обладать весьма абстрактным и широким мышлением, чтобы вообще тебя допустили что-то писать в БАЗОВОЙ(!!!!) библиотеке.