datetime模块
datetime 模块处理日期和时间,提供了 date、time、datetime、timedelta 等类型。它是处理时间数据的标准工具,支持日期计算、格式化、解析等功能。
核心类型
date:日期(年、月、日)
from datetime import date
today = date.today()
print today # 2024-01-15
print today.year # 2024
print today.month # 1
print today.day # 15
birthday = date(1990, 5, 20)
print birthday # 1990-05-20
time:时间(时、分、秒、微秒)
from datetime import time
noon = time(12, 0, 0)
print noon # 12:00:00
print noon.hour # 12
print noon.minute # 0
print noon.second # 0
datetime:日期和时间的组合
from datetime import datetime
now = datetime.now()
print now # 2024-01-15 14:30:25.123456
print now.year, now.month, now.day
print now.hour, now.minute, now.second
specific = datetime(2024, 1, 15, 14, 30, 0)
print specific # 2024-01-15 14:30:00
timedelta:时间差
from datetime import timedelta
delta = timedelta(days=5, hours=3, minutes=30)
print delta # 5 days, 3:30:00
future = datetime.now() + delta
print future # 5 天 3.5 小时后
日期计算
from datetime import date, timedelta
today = date.today()
yesterday = today - timedelta(days=1)
tomorrow = today + timedelta(days=1)
next_week = today + timedelta(weeks=1)
print yesterday # 昨天
print tomorrow # 明天
print next_week # 一周后
# 两个日期之差
days_left = date(2024, 12, 25) - today
print days_left.days # 距离圣诞节的剩余天数
格式化与解析
strftime:日期时间 → 字符串
from datetime import datetime
now = datetime.now()
print now.strftime("%Y-%m-%d") # 2024-01-15
print now.strftime("%H:%M:%S") # 14:30:25
print now.strftime("%A, %B %d, %Y") # Monday, January 15, 2024
常用格式码:
| 格式码 | 含义 | 示例 |
|---|---|---|
| %Y | 四位年份 | 2024 |
| %m | 月份(01-12) | 01 |
| %d | 日期(01-31) | 15 |
| %H | 小时(00-23) | 14 |
| %M | 分钟(00-59) | 30 |
| %S | 秒(00-59) | 25 |
| %A | 星期几 | Monday |
| %B | 月份名 | January |
strptime:字符串 → 日期时间
from datetime import datetime
dt = datetime.strptime("2024-01-15 14:30:00", "%Y-%m-%d %H:%M:%S")
print dt # 2024-01-15 14:30:00
date_only = datetime.strptime("2024-01-15", "%Y-%m-%d").date()
print date_only # 2024-01-15
时间戳转换
datetime → 时间戳:
from datetime import datetime
import time
now = datetime.now()
timestamp = time.mktime(now.timetuple())
print timestamp # 1705312225.0
时间戳 → datetime:
from datetime import datetime
import time
timestamp = time.time()
dt = datetime.fromtimestamp(timestamp)
print dt # 2024-01-15 14:30:25
实际应用
计算年龄:
from datetime import date
def calculate_age(birth_date):
today = date.today()
age = today.year - birth_date.year
if (today.month, today.day) < (birth_date.month, birth_date.day):
age -= 1
return age
birth = date(1990, 5, 20)
print calculate_age(birth) # 33
生成日期范围:
from datetime import date, timedelta
def date_range(start, end):
current = start
while current <= end:
yield current
current += timedelta(days=1)
for d in date_range(date(2024, 1, 1), date(2024, 1, 5)):
print d
# 2024-01-01 ... 2024-01-05
日志时间戳:
from datetime import datetime
def log(message):
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print "[%s] %s" % (timestamp, message)
log("Server started") # [2024-01-15 14:30:25] Server started
时区处理(简单方式):
Python 2.7 的 datetime 模块对时区支持有限。简单场景可以用固定偏移:
from datetime import datetime, timedelta
class TZOffset(object):
def __init__(self, hours):
self.offset = timedelta(hours=hours)
def utcoffset(self, dt):
return self.offset
beijing = TZOffset(8)
now = datetime.now(beijing)
print now # 2024-01-15 14:30:25+08:00
复杂时区处理建议使用第三方库 pytz:
import pytz
from datetime import datetime
utc = pytz.utc
beijing = pytz.timezone("Asia/Shanghai")
now = datetime.now(utc)
print now.astimezone(beijing) # 转换为北京时间
与 time 模块的区别
| 特性 | time 模块 | datetime 模块 |
|---|---|---|
| 精度 | 秒级(浮点数) | 微秒级 |
| 类型 | 时间戳(float) | 结构化对象 |
| 计算 | 需手动转换 | 直接加减 |
| 格式化 | 功能有限 | 功能丰富 |
import time
from datetime import datetime
# time 模块:底层、简单
print time.time() # 1705312225.123
# datetime 模块:高层、功能丰富
print datetime.now() # 2024-01-15 14:30:25.123456