上記のコードでは、次の誕生日までの日数を計算したかったのですが、出力が間違っています。あるべき姿:私の誕生日: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)
いくつかの問題:
以下は、これら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
calculate_dates
関数が何をしているのか考えてみてください。
あなたはあなたの誕生日を取得し、次に現在の時刻が現在の年のその誕生日からどれだけ離れているかを見ています。したがって、あなたがしていることは、あなたの誕生日までの日数を見つけることです今年過去であるかどうかにかかわらず。
たとえば、2月20日の誕生日を考えてみましょう。 date2
は2018-2-20
ではなく2019-2-20
になります。
これは、今年の1日がすでに過ぎているかどうかを確認することで修正できます。
これは私が誕生日までの日数を計算する方法です:
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)