Вариантов вижу 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 год грядёт ;-)).
Также учитывайте, что текущая реализация