Вверх ↑
Ответов: 4660
Рейтинг: 765
#1: 2017-06-02 15:24:36 ЛС | профиль | цитата
Нужно сформулировать правило, как действует компонент, когда на HeapIntToXXX подаётся 0 в год, месяц, день.
Вариантов вижу 4:
1) Выдавать ошибку, так как такого года-месяца-дня не существует. Не нравится мне такая идея. Но можно выдавать ошибку, если, например год(и/или месяц) не равен 0 и входит в диапазон данного типа даты, а месяц (или день) равны 0.
2) Принять и учитывать в компоненте 0-вую дату - дату, которой соответствует число 0 (Real - 01.01.0001, VCL 30.12.1899, Unix - 01.01.1970). Тогда считать, что если для HeapIntToXXX год-месяц-день равны 0, то год-месяц-день принять равными 0-вой дате в данном типе.
Это же надо будет реализовать в других методах, где нужно. Это мне нравится.
3) Для методов HeapIntToXXX - то же, что и в п.2. (если год-месяц-день равны 0), но за 0-вую принять минимально поддерживаемую у нас дату (Real - 01.01.0001). Но тогда в приведенном мной примере операции с датой Unix - в пролёте, так как будет выход за диапазон даты Unix32.
4) Можно, конечно, оставить всё как есть, и заставить пользователя цеплять на DYear\DMonth\DDay валидные значения, но это как-то костыльно, что-ли.

Правила для метода HeapIntToXXX можно распространить также на StrFmtToXXX, поскольку и там могут быть указаны 0.

По поводу даты Unix - поскольку она у нас 32-битная, то при операциях с ней вполне реальны выходы за диапазон - нужно предусмотреть выдачу ошибок и, возможно подстановку в результат соответствующего значения (если результат меньше минимального значения - в результат подставить минимальное значение, если больше максимального - максимальное).
Кроме того, можно либо ввести новый тип даты Unix64, либо расширить имеющийся, путём выдачи его в поле Real (2038 год грядёт ;-)).

Также учитывайте, что текущая реализация StrFmtToXXX/XXXToStrFmt не может обработать даты меньше 01.01.1601. Если дата меньше, то для этих методов нужно: StrFmtToXXX - выдавать ошибку, XXXToStrFmt - либо выдавать ошибку, либо перед подачей на конвертацию устанавливать порцию даты (или всю дату) равной 01.01.1601.
карма: 26

0
Редактировалось 10 раз(а), последний 2017-06-02 16:24:23