COleDateTime
- это обертка вокруг (удивительно удивительно) типа DATE
. Внутри он хранит 64-битное значение с плавающей запятой, где целые числа представляют дни с 30 декабря 1899 года (полночь). Дробная часть представляет время суток (например, 0.25
означает 6 часов утра, а 0.5
- полдень). Каждое значение с плавающей запятой является допустимым значением и представляет уникальный 1 момент времени.
Добавление года к значению COleDateTime
равносильно добавлению значения 365.0
(или любого другого значения) соответствует вашим потребностям) для его внутреннего представления. Это может быть сделано путем прямого доступа к элементу m_dt
COleDateTime datEnd{ datStart.m_dt + 365.0 };
или с помощью COleDateTimeSpan
datEnd = datStart + COleDateTimeSpan{ 365.0 };
// or
datEnd = datStart + COleDateTimeSpan{ 365, 0, 0, 0 };
This Операция всегда четко определена и даст действительный момент времени независимо от високосных лет. Под капотом просто добавляются значения с плавающей запятой, которые не имеют представления о календарных свойствах. Следующий код
COleDateTime datStart{ 2020, 2, 29, 0, 0, 0 };
COleDateTime datEnd{ datStart + COleDateTimeSpan{ 365.0 } };
создаст момент времени, который представляет 28 февраля 2021 года (обратите внимание, что если вы добавите 366.0
дней, он вернется 1 марта 2021 года).
Первоначальное решение, которое пытается построить COleDateTime
, выполняя арифметику c для отдельных компонентов даты, терпит неудачу во время построения. Конструктор проверяет свой ввод. При пропуске (2021, 2, 29, 0, 0, 0)
он определяет недопустимую дату и устанавливает m_status
на invalid
.
1 Это не совсем правильно , Значения в диапазоне (-1 .. 0]
отображаются в тот же момент времени, что и их абсолютные значения. Обратите внимание, что, например, COleDateTime{-0.25} == COleDateTime{0.25}
оценивается как false
, даже если они представляют один и тот же момент времени.