Например, вы помните, что во многих странах два раза в год переводят часы: в конце октября на час назад, а в конце марта на час вперёд? Получается, что в этих странах в марте не существует целого часа между 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).
Итак, получается, что при работе с такой простой и привычной сущностью как время, надо быть очень внимательным. Не стоит забывать про такие вещи, как високосный год и перевод часов. Не стоит пытаться обойти проблемы, добавляя лишние условия, а для начала попробуйте найти уже готовое решение. Именно так и становятся настоящими профессионалами.
Автор Игорь Поддубный, разработчик.