Вчера, 12 сентября, я получил раз 20 поздравление с днем программиста. День программиста — это 256-й день в году. Идея отмечать этот день понятная, интересная, воспринимается благожелательно, как программистами, так и остальными людьми.
Однако, когда я 1-й раз несколько лет назад услышал об этой дате, я по привычке провел факт-чекинг, чтобы вычислить точную дату дня программиста. Каково же было мое удивление, когда мои расчеты не совпали с датой, которую из года в год транслируют в СМИ.
Простая команда прибавляет к началу года 256 дней. Что же она возвращает?
date -I -d '2024-01-01 + 256 days'
13 сентября. Какого черта меня все поздравляют 12-го?
Может быть утилита date глючит? Попробуем посчитать на яве.
import java.time.LocalDate;
public class DeveloperDay {
public static void main(String[] args) {
System.out.println(LocalDate.now().withDayOfYear(1).plusDays(0x100));
}
}
Опять тринадцатое. Что происходит?
Я думаю, дело обстоит так.
Какие-то журналисты посчитали пальцем по календарю до двухсот пятидесяти шести и запустили статьи с поздравлениями на день раньше. Программисты, такие статьи, естественно, не читают, но от родственников, друзей и знакомых, узнали о том, что сегодня у них праздник. Перепроверять информацию никому в голову не пришло, поэтому новость закрепилась, и СМИ поставили ее публикацию в CRON. И теперь мы каждый год отмечаем день программиста не 13/14 сентября, а 12/13 (в високосный год дата уменьшается на 1 день).
Почему же так получилось? Дело в том, что когда составляли правила летосчисления, не умели
пользоваться нулем. Все считали на пальцах, а на них показать ноль нельзя. Поэтому получился отсчет, основанный на множестве натуральных чисел от 1 до 366.
365 1 2 3 4 5 ... 363 364 365 1 2 3 4 5 ... 363 364 365 366 1 2 3 4 5 ...
В этом множестве день, предшествующий дню номер 1, имеет номер 365 (или 366).
Но в таком множестве, с такими определениями операций сложения и вычитания, число 256 не является круглым. Не существует общепринятого формата представления для такого числа, в котором бы номер 256 выглядел бы как-то особенно красиво по сравнению с другими. Соответственно и с точки зрения программизма ничего примечательного в таком номере нет.
И только знание особой роли нуля отличает программистов от простых обывателей. Только они знают, что перед элементом с номером 1 находится элемент с номером 0, а номер 256 — это круглое число, потому что в двоичном представлении оно равно 0b100000000, а в шестнадцатеричном — 0x100.
Вот как раз наступление дня с круглым номером — это и есть настоящий праздник. В день с номером 0xFF программисты по традиции ходят в баню, а ровно в полночь при переходе от 0xFF к 0x100 в 00:00:00 UTC открывают шампанское и получают поздравления весь следующий день. В день номер 0xFF программистов тоже можно и нужно поздравлять, но… с наступающим.
Поздравляю, программисты!
Автор: sergey-b