вариант реализации
Sergey M. 20.04.2013 20:21
/ 20.04.2013 20:27
год назад мы это дело обсуждали в контексте cdate, но по идее такое и нативно можно прикрутить.
Суть в том что существует т.н. календарный цикл длинной в 28 лет, то есть если сделать date::now[] и потом отroll'ить её ровно на 28 лет назад, в полях такого обьекта кроме года ничего не изменится (теоритически).
Следовательно, мы можем взять текущий рабочий диапазон (от 01.01.1970 до 01.01.2038), и выделить допустим ровно в середине 28 лет, потом написать обертку на более высоком уровне абстракции, которая при попытке создания даты высчитывала бы "эквивалент" даты в нашем 28-летнем диапазоне, который передавала бы на более низкий уровень где формировался бы существующий обьект date; а так же высчитывала бы смещение относительно 28-летнего диапазона, которое бы запоминалось и использовалось потом для вывода полей (подменяя год из диапазона на актуальный). Ну и очень кстати в исходном рабочем диапазоне по краям осталось по 20 лет которые можно смело использовать для date.roll не боясь получить date.range exception.