Вместо того, чтобы циклически повторять числа более 2000 лет для подсчета дней, небольшая математика сэкономит много кода и времени.Далее следует григорианский календарь и его правила для високосных лет.
Абсолютное число дня - это любое целое число, которое увеличивается на 1 каждый календарный день.Для расчета дней между датами не имеет значения, какое значение имеет конкретная дата.Будут использоваться только различия.Для удобства я выберу начальное значение, где день 1 - 01 января-0001.
В любом данном году абсолютное число дней - это день текущего года (1-366) плюс числодней в предыдущие годы.Определение количества дней в предыдущих годах можно выполнить без цикла.
Если предположить, что имя входных переменных mm, dd, yyyy
для месяца (1-12), дня (1-31) и четырехзначного номера года,количество дней в предыдущих годах: days_before_jan1 = (гггг - 1) * 365 # 365 обычных дней в году days_before_jan1 + = (гггг - 1) // 4 # добавляем 1 високосный день каждые 4 года days_before_jan1 - = (гггг - 1)// 100 # удалить дни "четного века" days_before_jan1 + = (гггг - 1) // 400 # вернуть кратные 400
Это написано для экспозиции.В реальном коде я бы поместил все 4 условия в одно выражение t*365 + t//4 - t//100 - t//400
после установки t
в yyyy-1
.
Для дней в месяце вы могли бы создать список:
mdays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
if isleap(yyyy): mdays[1] = 29
Это число дней для каждого месяца yyyy
года, при условии, что вы определили функцию isleap
для возврата True
, если дан високосный год.Вы можете использовать это либо в цикле:
pm_days = 0 # days in preceding months
for m in range(1,mm): # loop through all preceding months this year
pm_days += mdays[m-1]
Или вы можете просто нарезать и суммировать дни с помощью: pm_days = sum (mdays [: mm])
Теперь сложите days_before_jan1 + pm_days + dd
и у вас есть абсолютный номер дня.
ПРИМЕЧАНИЕ. Обязательно используйте // для целочисленного деления в Python.Это необязательно в Python 2, но необходимо в Python 3.