Угадай-ка
От: Ночной Смотрящий Россия  
Дата: 09.12.22 13:37
Оценка: 166 (7) :)))
Сабж, что выведет код:
Console.WriteLine(TimeSpan.Parse("23:00:00").TotalHours);
Console.WriteLine(TimeSpan.Parse("24:00:00").TotalHours);
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re: Угадай-ка
От: vmpire Россия  
Дата: 09.12.22 14:48
Оценка: 9 (1)
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Сабж, что выведет код:

НС>
НС>Console.WriteLine(TimeSpan.Parse("23:00:00").TotalHours);
НС>Console.WriteLine(TimeSpan.Parse("24:00:00").TotalHours);
НС>


Да, действительно, забавно.
Посмотрел в исходники — там хитрый 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;
}
Отредактировано 09.12.2022 14:49 vmpire . Предыдущая версия . Еще …
Отредактировано 09.12.2022 14:48 vmpire . Предыдущая версия .
Re[2]: Угадай-ка
От: Baiker  
Дата: 10.12.22 21:02
Оценка:
Здравствуйте, vmpire, Вы писали:

НС>>Console.WriteLine(TimeSpan.Parse("24:00:00").TotalHours);


WTF??? 576?


V>После сопоставления по формату происходит проверка диапазонов...


ШТА?!! Какой ещё "диапазон" может быть у ИНТЕРВАЛА времени? Он же бесконечен!
Re[3]: Угадай-ка
От: karbofos42 Россия  
Дата: 11.12.22 06:17
Оценка:
Здравствуйте, Baiker, Вы писали:

B>WTF??? 576?


24 дня

B>ШТА?!! Какой ещё "диапазон" может быть у ИНТЕРВАЛА времени? Он же бесконечен!


Парсинг умеет не только формат чч:мм:сс, но и дд:чч:мм и вот так пытается предположить в каком формате задана исходная строка.
Не нравится — явно указывай какой формат нужен и не заставляй код автоподбором заниматься.
Re[4]: Угадай-ка
От: Baiker  
Дата: 11.12.22 12:02
Оценка:
Здравствуйте, karbofos42, Вы писали:

K>Здравствуйте, Baiker, Вы писали:

B>>ШТА?!! Какой ещё "диапазон" может быть у ИНТЕРВАЛА времени? Он же бесконечен!

K>Парсинг умеет не только формат чч:мм:сс, но и дд:чч:мм


Да? А варить кофе и макраме он не умеет? Неужели кретин, писавший код, не понимает, что надо не ДОГАДЫВАТЬСЯ (что очевидно, расстановка "временных бомб"), а использовать ОДИН формат по-умолчанию, а остальные указывать явно? Догадывальщики, ёпть.... "что-где-какгду" нашли!
И я не услышал ответа, почему я не могу распарсить интервал "сто минут"? ("0:100:00") Это что, что-то необычное для ИНТЕРВАЛА времени?
Re[4]: Угадай-ка
От: Baiker  
Дата: 11.12.22 12:03
Оценка:
Здравствуйте, karbofos42, Вы писали:

K> не заставляй код автоподбором заниматься.


Это что, "женский дотнет"? "Не поняла, но дай-ка я угадаю!"??
Не отвечай, я уже ржу в коликах
Re: Угадай-ка
От: _NN_ www.nemerleweb.com
Дата: 11.12.22 17:08
Оценка: +1
Здравствуйте, Ночной Смотрящий, Вы писали:

Главное, что задокументировано: TimeSpan.Parse

[ws][-]{ d | [d.]hh:mm[:ss[.ff]] }[ws]


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.

http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Угадай-ка
От: Ночной Смотрящий Россия  
Дата: 11.12.22 17:39
Оценка: +1
Здравствуйте, _NN_, Вы писали:

_NN>Главное, что задокументировано:


Я в курсе что задокументировано, но от этого оно не перестает быть веселыми граблями.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[4]: Угадай-ка
От: Ночной Смотрящий Россия  
Дата: 11.12.22 17:39
Оценка: +2
Здравствуйте, karbofos42, Вы писали:

B>>ШТА?!! Какой ещё "диапазон" может быть у ИНТЕРВАЛА времени? Он же бесконечен!

K>Парсинг умеет не только формат чч:мм:сс, но и дд:чч:мм

Отсюда интересный вопрос — что это за формат такой интересный, дд:чч:мм, и кто его использует.
Все вменяемые люди напишут 24d, а не 24:00:00.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[3]: Угадай-ка
От: vmpire Россия  
Дата: 11.12.22 18:25
Оценка:
Здравствуйте, Baiker, Вы писали:

V>>После сопоставления по формату происходит проверка диапазонов...


B>ШТА?!! Какой ещё "диапазон" может быть у ИНТЕРВАЛА времени? Он же бесконечен!

Диапазон у номера часа в сутках бесконечен?
Re[2]: Угадай-ка
От: vmpire Россия  
Дата: 11.12.22 18:27
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Главное, что задокументировано: TimeSpan.Parse


Вот это по нашему. Написал фигню — задокументируй и уже как бы не полная фигня.
Re[5]: Угадай-ка
От: karbofos42 Россия  
Дата: 11.12.22 18:33
Оценка:
Здравствуйте, Baiker, Вы писали:

B>Да? А варить кофе и макраме он не умеет? Неужели кретин, писавший код, не понимает, что надо не ДОГАДЫВАТЬСЯ (что очевидно, расстановка "временных бомб"), а использовать ОДИН формат по-умолчанию, а остальные указывать явно? Догадывальщики, ёпть.... "что-где-какгду" нашли!


Подавляющее большинство парсинга в .NET зависит от локали и нет там никакого формата по умолчанию.
Не нужно, чтобы метод перебирал все возможные форматы — нужно его явно задавать.
Так уж повелось в .NET

B>И я не услышал ответа, почему я не могу распарсить интервал "сто минут"? ("0:100:00") Это что, что-то необычное для ИНТЕРВАЛА времени?


Потому что так реализовали класс и так указано в документации. Почему такое решение выбрали — разработчики передо мной не отчитывались.
Это логично для TimeOnly, а для TimeSpan решение выглядит странным.
Re[5]: Угадай-ка
От: karbofos42 Россия  
Дата: 11.12.22 18:38
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Отсюда интересный вопрос — что это за формат такой интересный, дд:чч:мм, и кто его использует.

НС>Все вменяемые люди напишут 24d, а не 24:00:00.

Я встречал только д.чч:мм:сс, д.чч и т.п.
т.е. когда дни отделяются точкой, а не двоеточием
Может где-то за бугром такое активно используют, а то кому-то и формат мм/дд/гггг кажется странным и он не понимает чего это у него 10/10/2020 работало, а 20/10/2020 вылетает.
Re[2]: Угадай-ка
От: Sinclair Россия https://github.com/evilguest/
Дата: 11.12.22 18:52
Оценка: +1 :)
Здравствуйте, _NN_, Вы писали:
В общем, тест Титаником ребята из BCL бы не прошли. Тем, кто не застал, напомню, что его продолжительность — 2ч 74мин.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[6]: Угадай-ка
От: Ночной Смотрящий Россия  
Дата: 11.12.22 19:34
Оценка:
Здравствуйте, karbofos42, Вы писали:

K>Я встречал только д.чч:мм:сс, д.чч и т.п.

K>т.е. когда дни отделяются точкой, а не двоеточием
K>Может где-то за бугром такое активно используют,

А может и нет.

K>а то кому-то и формат мм/дд/гггг кажется странным и он не понимает чего это у него 10/10/2020 работало, а 20/10/2020 вылетает.


Ну так на то есть локализация.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[6]: Угадай-ка
От: Baiker  
Дата: 12.12.22 11:38
Оценка:
Здравствуйте, karbofos42, Вы писали:

B>>И я не услышал ответа, почему я не могу распарсить интервал "сто минут"? ("0:100:00") Это что, что-то необычное для ИНТЕРВАЛА времени?


K>Потому что так реализовали класс и так указано в документации


Ну так мы здесь спорим не о том, зачем дурак левый лапоть на правое ухо надел! Мы пытаемся понять, возможно был какой-то ГЛУБИННЫЙ СМЫЛ? Но как всегда, объяснение оказалось простое — тупость разрабов. Нет, не "маленький опыт", а именно тупость! Потому что наверняка БЫЛИ СПОРЫ по этому поводу, но решили всё сделать максимально простым (для себя) методом.
Итак, библиотека в очередной раз подкладывает свои тупые грабли, а мы по ним бегаем благодаря "специально отобранной" команде MS team!
Re[2]: Угадай-ка
От: Baiker  
Дата: 12.12.22 11:43
Оценка:
Здравствуйте, _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. Задачи настолько разные, что надо обладать весьма абстрактным и широким мышлением, чтобы вообще тебя допустили что-то писать в БАЗОВОЙ(!!!!) библиотеке.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.