Например, вы помните, что во многих странах два раза в год переводят часы: в конце октября на час назад, а в конце марта на час вперёд?
Получается, что в этих странах в марте не существует целого часа между 2:00 и 3:00 ночи, а в октябре наоборот — есть лишний час. Получается, если мы возьмём 28 марта 2020 г. 2:30 ночи и прибавим 1 год, мы получим несуществующее время 28 марта 2020 г. 2:30.
Эту проблему уже так просто не решить, ведь дата от года к году плавает. К тому же в разных странах часы переводят в разные числа, а где-то, как в России, не переводят вообще. Что же тогда делать?
А решение на самом деле простое. Математические операции над временем стоит проводить, сначала переведя дату и время в Unix-формат. Берём исходную дату и время, используя готовую функцию, переводим в секунды, начиная с 1 января 1970 года прибавляем нужное количество секунд (например, 10 лет = 10 * 365 * 24 * 60 * 60 секунд), используя другую готовую функцию, переводим обратно в дату и время.
В современных языках программирования для подобных операций всегда есть готовые функции или библиотеки. Например в JavaScript: moment().add(10, 'years'); в C#: DateTime.Now.AddYears(10).
Итак, получается, что при работе с такой простой и привычной сущностью, как время, надо быть очень внимательным. Не стоит забывать про такие вещи, как високосный год и перевод часов. Не стоит пытаться обойти проблемы, добавляя лишние условия, — для начала попробуйте найти уже готовое решение. Именно так и становятся настоящими профессионалами.