【Python 日期和时间】
Python 中处理日期和时间主要依赖 datetime
模块,结合 dateutil
和 pytz
等第三方库可实现更复杂的需求。以下是日期和时间处理的核心知识点:
一、基础模块
1. datetime
模块
- 核心类:
datetime
,date
,time
,timedelta
- 安装依赖:
pip install python-dateutil pytz # 推荐安装增强库
二、基础操作
1. 获取当前时间
from datetime import datetime, date, timenow = datetime.now() # 当前日期时间 → 2025-05-04 14:30:00.123456
today = date.today() # 当前日期 → 2025-05-04
current_time = time() # 当前时间 → 14:30:00.123456
2. 创建指定时间
dt = datetime(2025, 5, 4, 14, 30, 0) # 指定年月日时分秒
3. 时间戳转换
timestamp = datetime.now().timestamp() # → 1748896200.123456(Unix时间戳)
dt_from_ts = datetime.fromtimestamp(1748896200) # 时间戳转datetime
三、格式化与解析
1. 格式化输出
now = datetime.now()
formatted = now.strftime("%Y-%m-%d %H:%M:%S") # → "2025-05-04 14:30:00"
常用格式代码:
%Y
:4位年份(2025)%m
:2位月份(01-12)%d
:2位日期(01-31)%H
:24小时制小时(00-23)%M
:分钟(00-59)%S
:秒(00-59)%A
:星期全称(Monday)%B
:月份全称(January)
2. 解析字符串
date_str = "2025-05-04 14:30:00"
dt = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
四、时区处理
1. 天真时间(Naive Datetime)
naive_dt = datetime.now() # 不含时区信息(需谨慎使用)
2. 时区感知时间(Aware Datetime)
# 使用 pytz(推荐)
import pytzny_tz = pytz.timezone("America/New_York")
ny_time = datetime.now(ny_tz) # → 2025-05-04 02:30:00-04:00(含时区信息)# Python 3.9+ 使用 zoneinfo
from zoneinfo import ZoneInfotokyo_time = datetime.now(ZoneInfo("Asia/Tokyo"))
3. 时区转换
utc_dt = datetime.now(pytz.utc)
local_dt = utc_dt.astimezone(pytz.timezone("Asia/Shanghai"))
五、日期计算
1. 时间差计算
delta = timedelta(days=7, hours=3)
future_dt = now + delta # 7天3小时后
diff = future_dt - now # → 7 days, 3:00:00
2. 常用属性
dt = datetime(2025, 5, 4, 14, 30)
dt.year # → 2025
dt.month # → 5
dt.weekday() # → 6(周一=0,周日=6)
六、实际应用场景
1. 定时任务
import schedule
import timedef job():print("定时任务执行...")schedule.every().day.at("10:30").do(job) # 每天10:30执行while True:schedule.run_pending()time.sleep(1)
2. 日期验证
from dateutil.parser import parsedef is_valid_date(date_str):try:parse(date_str)return Trueexcept ValueError:return False
3. 生成时间戳
# 生成13位毫秒时间戳
timestamp = int(datetime.now().timestamp() * 1000)
4. 性能测试
from datetime import datetimestart = datetime.now()
# 执行需要测试的代码...
end = datetime.now()
print(f"耗时: {end - start}")
七、高级技巧
1. 处理模糊时间
from dateutil.parser import parsedt = parse("2025-05-04 14:30", fuzzy=True) # 允许部分解析
2. 生成时间范围
import pandas as pddate_range = pd.date_range(start="2025-05-01", end="2025-05-05", freq="D")
# → DatetimeIndex(['2025-05-01', '2025-05-02', ..., '2025-05-05'], dtype='datetime64[ns]', freq='D')
3. 计算年龄
from datetime import datedef calculate_age(birthdate):today = date.today()age = today.year - birthdate.yearif (today.month, today.day) < (birthdate.month, birthdate.day):age -= 1return age
八、常见陷阱
-
时区问题:
- 避免混合使用不同时区的时间
- 始终明确处理时区(不要假设本地时间)
-
月份范围:
# 错误示例:datetime(2025, 13, 1) 会报错 # 正确做法:验证月份范围(1-12)
-
闰年处理:
# 自动处理闰年(如2月29日) dt = datetime(2024, 2, 29) # 2024是闰年 dt = datetime(2025, 2, 28) + timedelta(days=1) # → 2025-03-01
通过掌握这些内容,可以高效处理从简单日期显示到复杂时区转换的各种场景。实际应用中需根据需求选择合适的方法,并特别注意时区一致性和日期有效性验证。