Программа "Мои дни между датами" выдает ошибку, когда в дате присутствует январь - PullRequest
0 голосов
/ 13 июня 2018

В моей программе, которая вычисляет дни между ошибками дат, когда я пытаюсь вычислить дни с января.В зависимости от месяца, если я использую один и тот же день в обеих датах, например, «Январь ДД, ГГГГ» и «Февраль ДД, ГГГГ», это даст мне ответ от + 18 до 22 дней в зависимости от месяца.Вот расчеты:

def indays(year,monthNum,day): ## year 
    leapyears = get_leapYear() ## monthNumber is "01,02 etc" 

    day_inYear = 365            ## day is day
    years_in_days = 0

    month_in_days = 0            

    for y in range(year): #this right here gets the year, and adds a year for every year in the range

        if y in leapyears:
            day_inYear = 366 ##checks if leapyear from the first function index, if it is, it adds 366 days instead of 365
        else:
            day_inYear = 365

        years_in_days = years_in_days + day_inYear

    for m in range(monthNum): #same thing as year, but months
        month = intLength[m]

        if monthNum == 1: ##sometimes i write a function that works, but forget how it works 2 days later.
            month_in_days = day ##i think if the date is in Jan, instead of getting "31" it just get's the given day.
        else:
            month_in_days = month_in_days + month

    sinceAD = years_in_days + month_in_days + day  #adds them up

    return sinceAD

, затем после этого в моей последней команде возврата у меня есть небольшой оператор if, который не удваивает дни, когда у меня есть два января (-а), потому что он будет считать датудважды

T1 = indays(yearX,monthNumX,daysX) #just for a value of life, see the if statment 
    T2 = indays(yearY,monthNumY,daysY)

    if T1 > T2: ##so answer isnt negative, checks which total days of date from zero is bigger, and it's y
        y = T1
        x = T2
    else:
        y = T2
        x = T1

    diff = (y - x)

    if monthNumX == 1 or monthNumY == 1:
        diff = diff - abs(daysX-daysY)
    else:
        pass

    return diff

Я имею в виду, что это скорее математический вопрос, чем вопрос программирования, но я супер потерян.

1 Ответ

0 голосов
/ 13 июня 2018

Вместо того, чтобы циклически повторять числа более 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...