web-dev-qa-db-ja.com

次の誕生日までの日数をpython

上記のコードでは、次の誕生日までの日数を計算したかったのですが、出力が間違っています。あるべき姿:私の誕生日:2002年2月20日=>私の誕生日まで203日(今日は2018年7月31日)実際の内容:入力:2002年2月20日=> 179日

私のコード:

import datetime


def get_user_birthday():
    year = int(input('When is your birthday? [YY] '))
    month = int(input('When is your birthday? [MM] '))
    day = int(input('When is your birthday? [DD] '))

    birthday = datetime.datetime(year,month,day)
    return birthday


def calculate_dates(original_date, now):
    date1 = now
    date2 = datetime.datetime(now.year, original_date.month, original_date.day)
    delta = date2 - date1
    days = delta.total_seconds() / 60 /60 /24

    return days


def show_info(self):
    pass



bd = get_user_birthday()
now = datetime.datetime.now()
c = calculate_dates(bd,now)
print(c)
7

いくつかの問題:

  1. 年は完全な整数として指定する必要があります。つまり、02(または2)ではなく2002です。
  2. 今年の生年月日が過ぎているかどうかを確認する必要があります。

以下は、これら2つの問題を修正するソリューションです。 2002年2月20日と今日の2018年7月31日の入力を考えると、次の誕生日は203日後です。

さらに、daysオブジェクトのtimedelta属性を使用できることに注意してください。これにより、203日に切り捨てられ、小数点以下の精度が回避されます。

from datetime import datetime

def get_user_birthday():
    year = int(input('When is your birthday? [YY] '))
    month = int(input('When is your birthday? [MM] '))
    day = int(input('When is your birthday? [DD] '))

    birthday = datetime(2000+year,month,day)
    return birthday

def calculate_dates(original_date, now):
    delta1 = datetime(now.year, original_date.month, original_date.day)
    delta2 = datetime(now.year+1, original_date.month, original_date.day)
    days = (max(delta1, delta2) - now).days
    # alternatively:
    # days = max(delta1, delta2).total_seconds() / 60 / 60 /24

    return days

bd = get_user_birthday()
now = datetime.now()
c = calculate_dates(bd, now)

print(c)

When is your birthday? [YY] 02
When is your birthday? [MM] 02
When is your birthday? [DD] 20

113
6
jpp

calculate_dates関数が何をしているのか考えてみてください。

あなたはあなたの誕生日を取得し、次に現在の時刻が現在の年のその誕生日からどれだけ離れているかを見ています。したがって、あなたがしていることは、あなたの誕生日までの日数を見つけることです今年過去であるかどうかにかかわらず。

たとえば、2月20日の誕生日を考えてみましょう。 date22018-2-20ではなく2019-2-20になります。

これは、今年の1日がすでに過ぎているかどうかを確認することで修正できます。

2
Ziyad Edher

これは私が誕生日までの日数を計算する方法です:

from datetime import datetime


def get_user_birthday():
    year = int(input('When is your birthday? [YY] '))
    month = int(input('When is your birthday? [MM] '))
    day = int(input('When is your birthday? [DD] '))

    birthday = datetime(year,month,day)
    return birthday


def calculate_dates(birthyday):
    now = datetime.now()
    birthday = datetime(now.year, birthday.month, birthday.day)
    return (birthday - now.today()).days + 1


bd = get_user_birthday()
c = calculate_dates(bd)
print(c)
1
Alex Jolig