03 - 日期时间处理¶
学习时间: 1小时 重要性: ⭐⭐⭐⭐⭐ 时间处理无处不在
🎯 学习目标¶
- 掌握datetime的基本用法
- 学会时间格式化和解析
- 处理时间差和时区
🕐 datetime 基础¶
获取当前时间¶
Python
from datetime import datetime, date, time
# 当前日期和时间
now = datetime.now()
print(now) # 2026-01-25 14:30:00.123456
# 只要日期
today = date.today()
print(today) # 2026-01-25
# 只要时间
current_time = datetime.now().time()
print(current_time) # 14:30:00.123456
# UTC时间
from datetime import timezone
utc_now = datetime.now(timezone.utc)
print(utc_now) # 2026-01-25 14:30:00+00:00
创建特定日期时间¶
Python
# 创建日期
d = date(2026, 1, 25)
print(d) # 2026-01-25
# 创建时间
t = time(14, 30, 0)
print(t) # 14:30:00
# 创建日期时间
dt = datetime(2026, 1, 25, 14, 30, 0)
print(dt) # 2026-01-25 14:30:00
# 从字符串解析
dt = datetime.strptime("2026-01-25 14:30:00", "%Y-%m-%d %H:%M:%S")
时间格式化¶
Python
now = datetime.now()
# 格式化为字符串
formatted = now.strftime("%Y-%m-%d %H:%M:%S")
print(formatted) # 2026-01-25 14:30:00
# 常用格式
print(now.strftime("%Y-%m-%d")) # 2026-01-25
print(now.strftime("%H:%M:%S")) # 14:30:00
print(now.strftime("%A, %B %d, %Y")) # Sunday, January 25, 2026
print(now.strftime("%Y%m%d_%H%M%S")) # 20260125_143000
# 从字符串解析
dt = datetime.strptime("2026-01-25", "%Y-%m-%d")
⏱️ 时间计算¶
timedelta - 时间差¶
Python
from datetime import timedelta
# 创建时间差
delta = timedelta(days=7, hours=2, minutes=30)
print(delta) # 7 days, 2:30:00
# 时间加减
now = datetime.now()
next_week = now + timedelta(days=7)
yesterday = now - timedelta(days=1)
future = now + timedelta(hours=3)
# 计算时间差
date1 = datetime(2026, 1, 25)
date2 = datetime(2026, 2, 1)
diff = date2 - date1
print(diff.days) # 7
# 判断时间先后
if date2 > date1:
print("date2 更晚")
实用示例¶
Python
# 1. 判断日期是否在范围内
from datetime import date, timedelta
def is_date_in_range(target, start, end):
"""检查target日期是否在[start, end]范围内"""
return start <= target <= end
today = date.today()
start = date(2026, 1, 1)
end = date(2026, 12, 31)
if is_date_in_range(today, start, end):
print("在范围内")
# 2. 获取上个月的第一天和最后一天
def get_last_month_range():
today = date.today()
first_day = today.replace(day=1)
last_month = first_day - timedelta(days=1)
first_day_of_last_month = last_month.replace(day=1)
return first_day_of_last_month, last_month
# 3. 计算下一个星期五
def next_friday():
today = date.today()
days_until_friday = (4 - today.weekday()) % 7
if days_until_friday == 0:
days_until_friday = 7
return today + timedelta(days=days_until_friday)
🌍 时区处理¶
Python
from datetime import datetime, timezone, timedelta
# 创建时区
beijing_tz = timezone(timedelta(hours=8))
tokyo_tz = timezone(timedelta(hours=9))
# 带时区的时间
now_beijing = datetime.now(beijing_tz)
print(now_beijing) # 2026-01-25 14:30:00+08:00
# 时区转换
now_tokyo = now_beijing.astimezone(tokyo_tz)
print(now_tokyo) # 2026-01-25 15:30:00+09:00
# ⚠️ 建议:使用第三方库处理复杂时区
# pip install pytz
# import pytz
# beijing = pytz.timezone('Asia/Shanghai')
💡 实用场景¶
场景1: 日志时间戳¶
Python
import logging
from datetime import datetime
def setup_logger():
"""配置日志格式,包含时间戳"""
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
logging.info("这是一条日志")
# 2026-01-25 14:30:00 - INFO - 这是一条日志
场景2: 数据时间筛选¶
Python
from datetime import datetime, timedelta
def filter_data_by_date(data, days=7):
"""筛选最近N天的数据"""
cutoff = datetime.now() - timedelta(days=days)
filtered = [
item for item in data
if datetime.fromisoformat(item['timestamp']) > cutoff
]
return filtered
# 使用
data = [
{"timestamp": "2026-01-20T10:00:00", "value": 10},
{"timestamp": "2026-01-24T10:00:00", "value": 20},
{"timestamp": "2026-01-25T10:00:00", "value": 30}
]
recent = filter_data_by_date(data, days=7)
场景3: 定时任务¶
Python
import time
from datetime import datetime
def run_daily_at(hour, minute, task):
"""每天在指定时间执行任务"""
while True:
now = datetime.now()
target = now.replace(hour=hour, minute=minute, second=0, microsecond=0)
if now >= target:
target += timedelta(days=1)
wait_seconds = (target - now).total_seconds()
print(f"等待 {wait_seconds:.0f} 秒后执行...")
time.sleep(wait_seconds)
task()
# 使用
def my_task():
print("执行任务!", datetime.now())
# run_daily_at(9, 0, my_task) # 每天早上9点执行
📝 练习¶
- 计算两个日期之间的工作日数量(排除周末)
- 实现一个简单的倒计时器
- 将时间戳转换为可读格式
🎯 自我检查¶
- 能创建和格式化datetime对象
- 能进行时间计算(加减、差值)
- 能解析和格式化时间字符串
- 理解时区的基本概念
- 能实现定时任务功能
- 能在实际项目中正确处理时间
📚 延伸阅读¶
- datetime文档
- pytz库 - 复杂时区处理
下一步: 04 - 命令行工具