Сколько дней между датами: ловушки подсчёта
Почему с понедельника по пятницу — то 4 дня, то 5, как високосные годы и разная длина месяцев путают подсчёт и как считать правильно.
Сколько дней с понедельника по пятницу? Четыре, если считать промежутки — так работают ночи в отеле. Пять, если считать сами дни — так суд считает срок. Оба ответа верны. Проблемы начинаются, когда два человека представляют себе разные варианты вопроса и выясняют это на ресепшене при выезде или в споре по договору.
У программистов для этого есть название — ошибка на единицу, она же «ошибка заборных столбов»: забор из 10 пролётов держится на 11 столбах. У всех остальных это звучит проще: «Постойте, я думал, дедлайн в пятницу».
Между датами или включая обе?
Практическое правило такое: измеряете расстояние — конечную дату не считайте. Измеряете длительность пребывания — считайте.
- Отель считает ночи: заехали 10-го, выехали 13-го — платите за три.
- Прокат машин обычно считает дни: взяли 10-го, вернули 13-го — в счёте нередко четыре.
- Дедлайны двусмысленны по своей природе, поэтому юристы пишут «не позднее 23:59 30 июня», а не «в течение 30 дней».
- Возраст считает завершённые интервалы: вам не 40, пока день рождения не наступил, как бы близко он ни был.
Наш калькулятор дней между датами делает выбор явным: флажок переключает между двумя способами, и с понедельника по пятницу вы видите 4 или 5 — и точно знаете, что именно посчитано.
Високосные годы: лишний день без предупреждения
Интервал, в который попало 29 февраля, на день длиннее «такого же» интервала в обычный год. Само правило устроено хитрее, чем кажется: год делится на 4 — високосный, но если делится на 100 — нет, но если заодно и на 400 — всё-таки да. Поэтому 2024-й был високосным, 1900-й — нет, а 2000-й — да. Программисты, пишущие работу с датами вручную, ошибаются здесь так часто, что у этой ошибки есть собственная категория в баг-трекерах.
Обычно об этом не думаешь — пока не считаешь проценты по кредиту на «365 дней», который незаметно длился 366, или не выясняешь, почему два одинаковых с виду диапазона различаются на день.
Месяц — единица, которая не стоит на месте
«Через два месяца» звучит точно, но точности там нет. 15 января плюс два месяца — 15 марта, здесь всё просто. А вот 31 января плюс месяц попадает на дату, которой не существует. Таблицы решили это прижатием к краю: функция ДАТАМЕС (EDATE) в Excel возвращает 28 или 29 февраля, и большинство библиотек дат поступают так же. Наш калькулятор использует то же правило, так что его месяцы совпадут с расчётом в таблице.
Отсюда же ощущение, что «сколько месяцев между датами» и «сколько дней между датами» противоречат друг другу. 30 дней — это то ли полный месяц, то ли нет, смотря куда в календаре эти 30 дней попали. С 1 февраля по 1 марта — месяц за 28 дней; с 1 по 31 июля — 30 дней и ноль полных месяцев.
Будни — это не рабочие дни
Калькулятор отдельно показывает будни (понедельник — пятница) и выходные. Честная оговорка: будни и рабочие дни — не одно и то же. Праздники в каждой стране свои, и никакой калькулятор не знает, какие из них выходные именно у вас. Число будней — это потолок; праздники вычитайте сами.
Хватит считать по пальцам
В следующий раз, когда нужен точный интервал — срок уведомления, окно визы, длина проекта или сколько вы на самом деле владеете машиной, — откройте калькулятор дней между датами. Он сразу показывает дни, недели, календарные месяцы и разбивку на будни и выходные, а флажок конечной даты закрывает спор про «плюс-минус день» ещё до его начала.