Не для кого не секрет, что мы сейчас пользуемся григорианским календарём введённым после Октябрьской революции большевиками, но празднуем христианские праздники по юлианскому календарю, который отличается от григорианского на 13 дней. Но почему так происходит? Давайте разбираться.

Юлианский календарь округляет год до 365 дней, вводя раз в 4 года дополнительный день, называемый високосным годом, из-за чего год становится равным 366 дням (0.25 * 4 = 1). Но из-за этого также с годами накапливаются и лишние дни, из-за чего точность такого календаря падает. Примерно за 1600 лет (Юлий Цезарь создал свой календарь в 45 год до н.э.) их накопилось 10 и поэтому папа римский Григорий XIII ввёл новый календарь, исправляющий эту неточность.

Вместо обычных високосных годов кратных 4 он "отсеял" кратные 100, но также отнёс к високосным кратные 400. То есть:

1700, 1800, 1900 теперь уже не високосные как прежде

А 1600, 2000 високосные.

Но этот календарь поспешили принять не все христианские страны. До XVIII века этот календарь, например, не принимали даже протестанты с их не любовью к католикам, не говоря уже о православных для которых традиция была важнее всего (этой традицией была расчёт Пасхи), поэтому тут даже новоюлианский календарь, разработанный сербским астрономом здесь не очень помог поскольку из-за своей более высокой точности ещё дальше уходил от традиций.

Так есть ли решение из этой долгой проблемы человечества? Ответ есть! И это не более высокая точность календаря, поскольку они всё равно не вечны и могут повторить ошибку 2000 г, а баланс между традицией (юлианский календарь) и новшеством (григорианский календарь). Как достичь такого баланса? Всё просто:

Берём год и считаем его високосным если он кратен 4 и 100, но не кратен 500.

1700, 1800, 1900 останутся високосными как и прежде (и даже 1600 как и в григорианском!)

А 1500, 2000 останутся обычными

Конечно, я не астроном, а лишь программист, который немного увлекается математикой, поэтому мнение настоящих специалистов по этому поводу будет очень ценно. А я только лишь буду рад что хотя бы немного помог человечеству продвинутся в этом направлении, используя современные технологии для создания такого календаря, независимо оттого введёт кто-либо мой календарь или наоборот отвергнет.

Вот код который генерирует календарь на Python исходя из его алгоритма (взял с ChatGPT):


import calendar

def is_julian_gregorian_leap(year):
    return ((year % 4 == 0) or (year % 100 == 0)) and (year % 500 != 0)
#Григорианский: return ((year % 4 == 0) and (year % 100 != 0)) or (year % 400 == 0)

def generate_custom_calendar(year):
    months_ru = [
        "Январь", "Февраль", "Март", "Апрель", "Май", "Июнь",
        "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"
    ]
    days_ru = ["Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"]

    # Количество дней в месяцах при обычном или високосном году по вашему правилу
    month_days = [31, 29 if is_julian_gregorian_leap(year) else 28, 31, 30, 31, 30,
                  31, 31, 30, 31, 30, 31]

    # Для определения дня недели 1 января используем классический календарь (григорианский)
    first_weekday = calendar.weekday(year, 1, 1)  # 0 - Понедельник

    print(f"Календарь (юлиано-григорианский) на {year} год\n")

    for month_idx in range(12):
        print(f"{months_ru[month_idx]} {year}")
        print(" ".join(days_ru))

        # Построение календаря месяца
        day = 1
        # Смещение первого дня месяца (зависит от первого дня года и даты начала месяца)
        # Для упрощения считаем сдвиг - создадим список с пустыми днями
        # Считаем день недели для 1 числа каждого месяца, поправляем вручную

        # Определяем день недели для 1 числа текущего месяца
        # Используем стандартный календарь для приближенного результата
        wd = calendar.weekday(year, month_idx+1, 1)

        # Печать строк недели
        week = ["   "] * ((wd + 6) % 7)  # смещение, чтобы понедельник=0 (calendar понедельник=0)
        while day <= month_days[month_idx]:
            week.append(f"{day:2} ")
            if len(week) == 7:
                print("".join(week))
                week = []
            day += 1
        
        if week:
            print("".join(week))
        print()

if __name__ == "__main__":
    y = int(input("Введите год: "))
    generate_custom_calendar(y)