Не существует такой вещи, как "добавление года".
Давайте предположим, что вы увеличиваете год на 1, в конце концов, это то, к чему вы стремитесь.
К сожалению, в нашем подходе ко времени есть некоторые несоответствия:
високосные годы: если вы находитесь 29 февраля 2008 года, что означает добавление года? 28 февраля 2009 или 1 марта 2009? (Подсказка: смена месяца очень смущает пользователя календаря)
високосные секунды : 30 июня или 31 декабря можно добавить секунду или две к последней минуте, сделав эту минуту 61 или 62 секунды. Это абсолютно противоречиво, и, к счастью, теперь от него отказались, но оно затронуло годы с 1972 по 2008 год. (Подсказка: еще раз, изменение дня сбивает с толку)
специальные события: например, перенастройка календаря , произошедшая в 1582 году, когда за четвергом, 4 октября 1582 года, последовала пятница, 15 октября 1582 года, что привело к полной потере в 10 дней .
Проблема здесь не в том, чтобы «добавить» год, вы всегда можете выбрать округление (предпочтительно при участии конечных пользователей) или увеличение. Реальная проблема заключается в том, что если вы будете следовать этим рассуждениям, вы, к сожалению, потеряете симметрию между добавлением и удалением года:
- оригинал: 29 февраля 2008
+
1 год: 1 марта 2009 г. (округление)
-
1 год: 1 марта 2008 г.
или добавив 4 года в несколько последовательных скачков:
- оригинал: 29 февраля 2008
+
2 года: 28 февраля 2010 г. (округление вниз)
+
2 года: 28 февраля 2012 года
Oups!
Математическое решение этой проблемы - просто оценить продолжительность года в секундах, Давайте спросим об этом у Вольфрама : 3,154 × 10 ^ 7 секунд.
Однако, это может сбить пользователя с толку.
И, наконец, последнее решение заключается в том, что всякий раз, когда вы выполняете вычисления на основе дат и продолжительности, вы сохраняете исходную дату отдельно, вычисляете длительности самостоятельно, а затем корректируете «отображаемую» дату.
Таким образом, вы будете как математически корректны (т.е. уважать симметрию и ассоциативность), так и вести себя интуитивно для конечных пользователей.
class MyTime {
...
private:
tm _origin;
tm _deviation;
};
Однако это больше работы ... так что вам придется самостоятельно выбирать схему в зависимости от потребностей вашего приложения.