Как точно рассчитать дни между датами? - PullRequest
0 голосов
/ 25 февраля 2020

Я написал следующую Python функцию, которая берет из пользовательских данных в форме даты их рождения и вычисляет, сколько им лет сегодня и сколько дней осталось до их дня рождения в этом году:

# %load time_2_bday.py
"""
Created on Thu Feb 20 16:01:33 2020
@author: hussain.ali

"""
import datetime as dt
import pytz
def days_to_birthday():
    ''' this function takes from the user data in the form of their birthdate 
        and calculates how many more days are remaining until their birthday this year'''

    a = (input('Enter the date on which you were born:'))
    b = (input('Enter the month in which you were born:'))
    c = (input('Enter the year in which you were born:'))
    d = '%s%s%s'%(c,b,a)
    now = dt.datetime.now()
    curr_yr = str((now.year))
    td = dt.datetime.today()
    #td.replace(hour=0, minute=0, second=0, microsecond=0)
    birthday = dt.datetime.strptime(d, '%Y%m%d')
    days_old = td - birthday

    if int(b) <= td.month:
        days_to_birthday = td - dt.datetime.strptime('%s%s%s'%(curr_yr,b,a), '%Y%m%d')
        print('You stand', days_old.days//365,'years old today and there are', 365- days_to_birthday.days, 'days remaining until your next birthday!')        
    else:
        days_to_birthday = dt.datetime.strptime('%s%s%s'%(curr_yr,b,a), '%Y%m%d') - td
        print('You stand', days_old.days//365,'years old today and there are',days_to_birthday.days, 'days remaining until your next birthday!')

days_to_birthday()

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

============= RESTART: C: \ Users \ hussain.ali \ Desktop \ time_2_bday.py ============= Введите дату в котором вы родились: 10 Введите месяц, в котором вы родились: 05 Укажите год, в котором вы родились: 1986 Сегодня вам исполнилось 33 года, и до вашего следующего дня рождения осталось 74 дня!

Хотя фактическое количество дней, оставшихся до 10 мая 2020 года, составляет 75.

Это потому, что в феврале этого года 29 дней, и я пропустил что-то, что должно учитывать этот 1 дополнительный день?

Может кто-нибудь также сказать мне, если этот сценарий Тим в курсе или наивны?

1 Ответ

1 голос
/ 25 февраля 2020

Вместо того, чтобы разбирать ваш код на части, я продемонстрирую более упрощенный способ достижения этого:

from datetime import date

year = int(input('Year:'))
month = int(input('Month:'))
day = int(input('Day:'))

birthday = date(year, month, day)
today = date.today()
next_birthday = birthday.replace(year=today.year)

if next_birthday < today:
    # birthday for this year has already passed
    next_birthday = next_birthday.replace(year=next_birthday.year + 1)

print('You are', int((today - birthday).days / 365), 'years old')
print('Your next birthday is in', (next_birthday - today).days, 'days')

Единственное, что вам нужно знать, это то, что дни рождения в високосный день будут выбрасывать ошибки в строках, где вы вычисляете next_birthday, если этот год не високосный. Несколько неизвестно, как с этим справиться; люди, чей день рождения в високосный день, могут обычно отмечать один день раньше, но некоторые могут праздновать день поздно. Там могут быть разные местные * aws, как возраст определен юридически тогда. Вам нужно определить, как вы хотите с этим справиться.

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