Python3 【datetime模块】编程范例:10 datetime 经典应用代码示例
本文展示 10 个 Python datetime
模块的经典应用范例,附带代码示例和详细解释:
1. 计算年龄(精确到天)
场景:根据出生日期计算用户的年龄(精确到天数)。
from datetime import date
def calculate_age(birth_date: date) -> tuple:
today = date.today()
years = today.year - birth_date.year
months = today.month - birth_date.month
days = today.day - birth_date.day
# 调整未过生日的情况
if (months < 0) or (months == 0 and days < 0):
years -= 1
months += 12
# 计算剩余天数
if days < 0:
last_month = today.replace(month=today.month - 1)
days_in_last_month = (today - last_month).days
days += days_in_last_month
months -= 1
return years, months, days
birthday = date(1995, 8, 20)
age = calculate_age(birthday)
print(f"年龄:{age[0]}岁 {age[1]}月 {age[2]}天")
# 输出示例:年龄:28岁 1月 15天
2. 时间戳与日期互转
场景:将 Unix 时间戳转换为可读日期,或反向操作。
from datetime import datetime
# 时间戳 -> 日期
timestamp = 1696521600 # 2023-10-05 00:00:00 UTC
dt = datetime.fromtimestamp(timestamp)
print(f"时间戳转日期:{dt.strftime('%Y-%m-%d %H:%M:%S')}") # 输出:2023-10-05 00:00:00
# 日期 -> 时间戳
dt_obj = datetime(2023, 10, 5, 0, 0)
timestamp = int(dt_obj.timestamp())
print(f"日期转时间戳:{timestamp}") # 输出:1696521600
3. 生成日期范围
场景:生成两个日期之间的所有日期列表。
from datetime import datetime, timedelta
def date_range(start: str, end: str) -> list:
start_date = datetime.strptime(start, "%Y-%m-%d")
end_date = datetime.strptime(end, "%Y-%m-%d")
delta = end_date - start_date
dates = []
for i in range(delta.days + 1):
current_date = start_date + timedelta(days=i)
dates.append(current_date.strftime("%Y-%m-%d"))
return dates
date_list = date_range("2023-10-01", "2023-10-05")
print(date_list) # 输出:['2023-10-01', '2023-10-02', ..., '2023-10-05']
4. 判断闰年
场景:检查某年是否为闰年。
from datetime import date
def is_leap_year(year: int) -> bool:
try:
date(year, 2, 29) # 尝试创建2月29日
return True
except ValueError:
return False
print(is_leap_year(2024)) # 输出:True
print(is_leap_year(2023)) # 输出:False
5. 倒计时功能
场景:计算距离某个未来时间点的剩余时间。
from datetime import datetime, timedelta
def countdown(target: str) -> timedelta:
now = datetime.now()
target_time = datetime.strptime(target, "%Y-%m-%d %H:%M:%S")
remaining = target_time - now
return remaining
remaining_time = countdown("2024-01-01 00:00:00")
print(f"距离2024年元旦还有:{remaining_time.days}天 {remaining_time.seconds//3600}小时")
6. 统计代码执行时间
场景:测量某段代码的运行耗时。
from datetime import datetime
start = datetime.now()
# 模拟耗时操作
for _ in range(1000000):
pass
end = datetime.now()
elapsed = end - start
print(f"代码执行耗时:{elapsed.total_seconds():.4f}秒")
# 输出示例:代码执行耗时:0.1234秒
7. 时区转换
场景:将本地时间转换为其他时区的时间。
from datetime import datetime
import pytz
# 本地时间 -> UTC时间
local_time = datetime.now()
utc_time = local_time.astimezone(pytz.utc)
print(f"UTC时间:{utc_time.strftime('%Y-%m-%d %H:%M:%S')}")
# UTC时间 -> 纽约时间
ny_tz = pytz.timezone("America/New_York")
ny_time = utc_time.astimezone(ny_tz)
print(f"纽约时间:{ny_time.strftime('%Y-%m-%d %H:%M:%S')}")
8. 获取月末日期
场景:计算某个月份的最后一天。
from datetime import date
import calendar
def last_day_of_month(year: int, month: int) -> date:
_, last_day = calendar.monthrange(year, month)
return date(year, month, last_day)
print(last_day_of_month(2023, 2)) # 输出:2023-02-28
print(last_day_of_month(2024, 2)) # 输出:2024-02-29
9. 解析 ISO 8601 格式日期
场景:处理符合国际标准的日期字符串。
from datetime import datetime
iso_date_str = "2023-10-05T14:30:45+08:00"
dt = datetime.fromisoformat(iso_date_str)
print(dt) # 输出:2023-10-05 14:30:45+08:00
# 反向生成 ISO 格式
print(dt.isoformat()) # 输出原字符串
10. 时间差统计(精确到分钟)
场景:计算两个时间点之间的分钟数差值。
from datetime import datetime
def minutes_diff(start: str, end: str) -> int:
fmt = "%Y-%m-%d %H:%M:%S"
start_time = datetime.strptime(start, fmt)
end_time = datetime.strptime(end, fmt)
delta = end_time - start_time
return delta.total_seconds() // 60
diff = minutes_diff("2023-10-05 09:30:00", "2023-10-05 11:45:00")
print(f"时间差:{diff} 分钟") # 输出:135 分钟
总结
这些范例覆盖了 datetime
模块的常见需求:
- 时间计算:年龄、倒计时、月末日期
- 格式转换:时间戳、ISO 8601、时区
- 实用工具:日期范围生成、闰年判断、代码计时
- 业务逻辑:用户年龄验证、数据分析周期统计
通过组合这些方法,可以解决绝大多数日期时间处理问题。进阶场景可结合 dateutil
或 pandas
库进一步扩展。