Python计算年份间隔分钟数结果不符,请求代码排查
计算出生年份至当前年份的分钟数结果不符合预期问题排查
我在完成编程挑战时,编写了Python代码计算从出生年份到当前年份的分钟数,但输入1930时,预期结果为48,355,200,实际得到48,388,320。代码如下:
import datetime this_year = datetime.datetime.today().year def age_in_minutes(b_year: int): d1 = datetime.datetime.strptime(f'{this_year}', '%Y') d2 = datetime.datetime.strptime(f'{b_year}', '%Y') age = (d1-d2).days * 24 * 60 return f"{age:,}" while True: birth_year = input("Enter you birth year: ") try: if int(birth_year) == this_year: print("Please enter year less than this year...") elif int(birth_year) > this_year: print("Please enter year less than this year...") elif len(birth_year) < 4 or len(birth_year) > 5: print("PLease enter a valid year...") elif int(birth_year) <= 1900: print("Please enter a year after 1900...") else: minutes_old = age_in_minutes(int(birth_year)) print(f"You are {minutes_old} minutes old.") break except ValueError: print("Please enter in a year format: ")
问题根源
你的代码计算的是出生年份1月1日到当前年份1月1日之间的实际天数,其中包含了这段时间内所有闰年的额外天数(闰年有366天,比平年多1天)。而预期结果是按每年固定365天计算的,没有考虑闰年的差异。
举个例子:如果当前年份是2022,1930到2022共92年,按平年算总天数是92*365=33580,对应分钟数33580*24*60=48355200,正好是你的预期结果;而实际计算时,这段时间内有23个闰年,总天数会多23天,最终分钟数就会比预期多23*24*60=33120,即48355200+33120=48388320,和你得到的实际结果一致。
解决方案
根据题目要求,分两种情况处理:
情况1:题目要求按每年365天平算(不考虑闰年)
直接计算年份差乘以平年的分钟数即可,无需使用datetime模块:
def age_in_minutes(b_year: int): year_diff = this_year - b_year total_minutes = year_diff * 365 * 24 * 60 return f"{total_minutes:,}"
情况2:题目要求计算到当前日期的实际分钟数(而非当年1月1日)
如果是要计算从出生年份的今天到当前日期的实际分钟数,需要调整datetime的初始化,用当前日期而非当年1月1日:
def age_in_minutes(b_year: int): # 获取当前日期时间 d1 = datetime.datetime.today() # 出生年份的当前月日(注意如果当前是2月29日,出生年非闰年的话会自动调整到2月28日) d2 = datetime.datetime(b_year, d1.month, d1.day) # 计算总秒数后转分钟 total_minutes = int((d1 - d2).total_seconds() // 60) return f"{total_minutes:,}"
额外优化点
- 输入验证部分可以合并重复判断:比如
int(birth_year) >= this_year可以合并成一个条件 - 长度判断可以放在类型转换之前,避免重复转换int:
while True: birth_year = input("Enter your birth year: ") # 先检查格式长度 if len(birth_year) not in (4,5): print("Please enter a valid year...") continue try: birth_year_int = int(birth_year) if birth_year_int >= this_year: print("Please enter year less than this year...") elif birth_year_int <= 1900: print("Please enter a year after 1900...") else: minutes_old = age_in_minutes(birth_year_int) print(f"You are {minutes_old} minutes old.") break except ValueError: print("Please enter in a year format: ")
内容的提问来源于stack exchange,提问作者Kay EL
相关产品推荐
相关产品推荐

