如何使用Python编写无需datetime库的出生日期存活天数计算程序
不使用datetime库实现存活天数计算方案
核心逻辑说明
- 首先实现闰年判断:满足以下两个条件之一即为闰年:
- 年份能被4整除但不能被100整除
- 年份能被400整除
- 定义平年、闰年的月份天数列表,直接查表获取每个月的天数
- 编写工具函数计算指定日期是当年的第多少天
- 计算两个日期的总天数差,即为存活天数
完整代码实现
# 辅助函数:判断是否为闰年 def is_leap_year(year): if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0): return True return False # 辅助函数:计算日期是当年的第几天 def calc_day_of_year(year, month, day): # 平年各月天数 month_days = [31,28,31,30,31,30,31,31,30,31,30,31] if is_leap_year(year): month_days[1] = 29 # 闰年2月加1天 total = 0 # 累加之前月份的所有天数 for i in range(month - 1): total += month_days[i] # 加上当前月的天数 total += day return total # 原有逻辑修改扩展 date_of_birth = input("请输入出生日期 (格式为YYYY/MM/DD):") now_date = "2021/09/11" # 固定当前日期,如需动态可以自行修改 # 1. 基础格式校验 if len(date_of_birth) != 10 or date_of_birth[4] != '/' or date_of_birth[7] != '/': print("输入的日期格式无效,请按照YYYY/MM/DD格式输入") else: # 2. 转成整数类型的年月日 try: birth_y = int(date_of_birth[0:4]) birth_m = int(date_of_birth[5:7]) birth_d = int(date_of_birth[8:10]) now_y = int(now_date[0:4]) now_m = int(now_date[5:7]) now_d = int(now_date[8:10]) except: print("日期包含非数字内容,输入无效") exit() # 3. 日期合法性校验 month_days = [31,29 if is_leap_year(birth_y) else 28,31,30,31,30,31,31,30,31,30,31] if birth_m <1 or birth_m >12: print("输入的月份无效") exit() if birth_d <1 or birth_d > month_days[birth_m-1]: print("输入的日期天数无效") exit() if (birth_y, birth_m, birth_d) > (now_y, now_m, now_d): print("出生日期不能晚于当前日期") exit() # 4. 核心计算存活天数 total_days = 0 # 情况1:出生年份和当前年份不同 if birth_y < now_y: # 先算出生当年剩余的天数 if is_leap_year(birth_y): total_days += 366 - calc_day_of_year(birth_y, birth_m, birth_d) else: total_days += 365 - calc_day_of_year(birth_y, birth_m, birth_d) # 加上中间完整年份的总天数 for y in range(birth_y + 1, now_y): total_days += 366 if is_leap_year(y) else 365 # 加上当前年份已经过的天数 total_days += calc_day_of_year(now_y, now_m, now_d) # 情况2:出生年份和当前年份相同 else: total_days = calc_day_of_year(now_y, now_m, now_d) - calc_day_of_year(birth_y, birth_m, birth_d) print(f"从出生日期到2021/09/11一共存活了 {total_days} 天")
补充说明
- 代码在原有长度校验的基础上补充了分隔符校验、内容合法性校验、月份天数边界校验,避免无效输入
- 所有逻辑完全自主实现,没有调用datetime等第三方时间库,符合需求
- 如果需要动态获取当前日期,不需要改核心计算逻辑,只需要修改
now_date变量的赋值即可
内容的提问来源于stack exchange,提问作者1JM_
相关产品推荐
相关产品推荐

