image

Вчера, 12 сентября, я получил раз 20 поздравление с днем программиста. День программиста — это 256-й день в году. Идея отмечать этот день понятная, интересная, воспринимается благожелательно, как программистами, так и остальными людьми.



Однако, когда я 1-й раз несколько лет назад услышал об этой дате, я по привычке провел факт-чекинг, чтобы вычислить точную дату дня программиста. Каково же было мое удивление, когда мои расчеты не совпали с датой, которую из года в год транслируют в СМИ.

Простая команда прибавляет к началу года 256 дней.

date -I -d '2024-01-01 + 256 days'


Что же она возвращает?
2024-09-13

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));
    }
}


Результат
2024-09-13

Опять тринадцатое. Что происходит?


Я думаю, дело обстоит так.

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

Поздравляю, программисты!

Комментарии (11)


  1. askv
    13.09.2024 01:31
    +10

    Посчитайте 1-й день года по Вашей формуле, у Вас получится 2-е января, т.е. на самом деле второй. Т.е. прибавлять 256 нужно к дате 31.12.2023, а не 01.01.2024. Тогда 256-й день получится 12.09.2024, всё правильно посчитано.


    1. omaxx
      13.09.2024 01:31
      +6

      Просто у него первое января это нулевой день, а не первый...


      1. askv
        13.09.2024 01:31

        А в Excel'е есть несуществующая дата 29.02.1900, и что? )


      1. askv
        13.09.2024 01:31
        +1

        Хотя, может так и логичней, если праздник наступает в 0 часов 0 минут по прошествии 256 дней, то есть на 257-й день. Тогда действительно праздник надо сдвигать на 1 день вперёд (13 сентября в високосные годы и 14 сентября в обычные). У нас же Новый год наступает в 0 часов 0 минут 1 января, а не 31 декабря.


  1. sanneo
    13.09.2024 01:31

    Нольник или начальник)


  1. MinimumLaw
    13.09.2024 01:31
    +1

    Ох уж мне эти вечные споры... Я помню аналог про смену тысячелетия (31.12.1999-01.01.2000 или 31.12.2000-01.01.2001).

    В целом, 256 - это максимальное число комбинаций, влезающих в байт (8 бит). У нас нет нулевого января - значит формально такая дата невозможна (ошибочна). То же относительно месяца. Чего не скажешь о времени - ибо "минута без времени" между 23:59 и 00:01 вполне возможна.

    Идея о 13-ом сентября 2024-ого - она прямо в духе тех, кто отчет тысячелетий начал с 01.01.2001. И, если честно, тогда это все порядком надоело.


  1. grokinn
    13.09.2024 01:31

    Если отсчитывать год с 0, то просто праздновать нужно день № 255, который является 256-м днем года. Если у вас есть 8 бит и вам надо присвоить каждому дню уникальную последовательность, то 12 сентября 2024 в день № 255 память закончится.

    Если бы мы отмечали не день программиста, а коду программиста, т.е. период в 256 дней, то отмечать его следовало бы с началом новой коды на 257-й день, но тогда в календаре это была бы каждый раз разная дата.


  1. AWRDev
    13.09.2024 01:31
    +4

    Однако, когда я 1-й раз несколько лет назад услышал об этой дате, я по привычке провел факт-чекинг, чтобы вычислить точную дату дня программиста.

    А в 0-й раз почему не провели, в этом то вся и проблема. Вы опоздали с проверкой.


  1. YegorP
    13.09.2024 01:31

    Комментарии... Есть какая-то забавная ирония во всех этих рассуждениях. Типичная off by one error. Праздновать два дня будем.


  1. onix74
    13.09.2024 01:31

    ~$ date '+%d.%m.%Y'; date +%j
    13.09.2024
    257
    ~$ date -d '-1 days' '+%d.%m.%Y'; date -d '-1 days' +%j
    12.09.2024
    256
    


  1. Bedal
    13.09.2024 01:31

    Это день эникейщика, если угодно - админа. День программиста - 10 декабря, конечно.