Python3 日期和时间完全指南
编程小白也能轻松理解的日期时间处理知识汇总
核心概念
在编程中处理时间,我们需要理解几个基本概念:
- 时间戳(Timestamp):计算机存储时间的标准方式,表示从1970年1月1日00:00:00 UTC(称为Unix纪元)开始经过的秒数
- 日期(Date):包含年、月、日的信息
- 时间(Time):包含时、分、秒、微秒的信息
- 时区(Timezone):全球分为24个时区,处理时间必须考虑时区的影响
2023
年
11
月
20
日
14:30
时间
UTC+8
时区
time模块
time
模块提供与时间相关的基本功能:
获取当前时间戳
import time
current_time = time.time()
# 输出:1699967890.123456 (当前时间戳)
current_time = time.time()
# 输出:1699967890.123456 (当前时间戳)
时间戳转时间元组
time_tuple = time.localtime(current_time)
# 输出:time.struct_time(tm_year=2023, tm_mon=11,
# tm_mday=13, tm_hour=14, tm_min=30, tm_sec=15, …)
# 输出:time.struct_time(tm_year=2023, tm_mon=11,
# tm_mday=13, tm_hour=14, tm_min=30, tm_sec=15, …)
格式化时间
formatted = time.strftime(“%Y-%m-%d %H:%M:%S”, time_tuple)
# 输出:”2023-11-13 14:30:15″
# 输出:”2023-11-13 14:30:15″
小提示: time模块适合简单的时间操作,对于复杂的日期计算建议使用datetime模块
datetime模块
datetime
模块提供更高级的日期时间处理功能:
获取当前日期和时间
from datetime import datetime
now = datetime.now()
# 输出:datetime(2023, 11, 13, 14, 30, 15, 123456)
now = datetime.now()
# 输出:datetime(2023, 11, 13, 14, 30, 15, 123456)
创建特定日期
from datetime import date
d = date(2023, 11, 13)
# 输出:datetime.date(2023, 11, 13)
d = date(2023, 11, 13)
# 输出:datetime.date(2023, 11, 13)
日期时间格式化
formatted = now.strftime(“%Y年%m月%d日 %H时%M分”)
# 输出:”2023年11月13日 14时30分”
# 输出:”2023年11月13日 14时30分”
时间计算
from datetime import timedelta
tomorrow = now + timedelta(days=1)
last_week = now – timedelta(weeks=1)
tomorrow = now + timedelta(days=1)
last_week = now – timedelta(weeks=1)
时区处理
处理时区是日期时间的关键部分:
设置时区
from datetime import datetime, timezone, timedelta
# 创建UTC时间
utc_time = datetime.now(timezone.utc)
# 创建自定义时区(如北京时间)
beijing_tz = timezone(timedelta(hours=8))
beijing_time = datetime.now(beijing_tz)
# 创建UTC时间
utc_time = datetime.now(timezone.utc)
# 创建自定义时区(如北京时间)
beijing_tz = timezone(timedelta(hours=8))
beijing_time = datetime.now(beijing_tz)
时区转换
# 将北京时间转换为纽约时间
from pytz import timezone
bj = timezone(‘Asia/Shanghai’)
ny = timezone(‘America/New_York’)
bj_time = datetime.now(bj)
ny_time = bj_time.astimezone(ny)
# 北京时间比纽约时间早13小时
from pytz import timezone
bj = timezone(‘Asia/Shanghai’)
ny = timezone(‘America/New_York’)
bj_time = datetime.now(bj)
ny_time = bj_time.astimezone(ny)
# 北京时间比纽约时间早13小时
提示: 对于高级时区处理,建议安装pytz库:
pip install pytz
时间格式化符号
格式化字符串常用符号:
%Y – 四位数年份(2023)
%y – 两位数年份(23)
%m – 两位数的月份(01-12)
%d – 两位数的日期(01-31)
%H – 24小时制小时(00-23)
%I – 12小时制小时(01-12)
%M – 分钟(00-59)
%S – 秒(00-59)
%A – 完整的星期名(Monday)
%B – 完整的月份名(November)
%p – AM/PM标识(AM/PM)
%y – 两位数年份(23)
%m – 两位数的月份(01-12)
%d – 两位数的日期(01-31)
%H – 24小时制小时(00-23)
%I – 12小时制小时(01-12)
%M – 分钟(00-59)
%S – 秒(00-59)
%A – 完整的星期名(Monday)
%B – 完整的月份名(November)
%p – AM/PM标识(AM/PM)
格式化示例
now.strftime(“%Y-%m-%d”) # “2023-11-13”
now.strftime(“%d/%m/%y”) # “13/11/23”
now.strftime(“%I:%M %p”) # “02:30 PM”
now.strftime(“%A, %B %d”) # “Monday, November 13”
now.strftime(“%d/%m/%y”) # “13/11/23”
now.strftime(“%I:%M %p”) # “02:30 PM”
now.strftime(“%A, %B %d”) # “Monday, November 13”
时间计算与比较
datetime对象可以直接进行比较和数学运算:
日期比较
from datetime import date
d1 = date(2023, 11, 10)
d2 = date(2023, 11, 15)
d1 < d2 # True
d1 == d2 # False
d1 = date(2023, 11, 10)
d2 = date(2023, 11, 15)
d1 < d2 # True
d1 == d2 # False
日期差计算
delta = d2 – d1
print(delta.days) # 5
print(type(delta)) # <class ‘datetime.timedelta’>
print(delta.days) # 5
print(type(delta)) # <class ‘datetime.timedelta’>
生日计算器
birthday = date(1990, 5, 15)
today = date.today()
age = today.year – birthday.year
# 如果今年生日还没过,年龄减1
if (today.month, today.day) < (birthday.month, birthday.day):
age -= 1
today = date.today()
age = today.year – birthday.year
# 如果今年生日还没过,年龄减1
if (today.month, today.day) < (birthday.month, birthday.day):
age -= 1
重要提示
1. 处理时间时始终考虑时区
2. 使用datetime代替time进行复杂操作
3. 时间戳便于存储,datetime对象便于操作
常见错误
1. 忽略时区导致时间错误
2. 混淆时间戳与格式化时间
3. 使用两位数年份导致千年虫问题
最佳实践
1. 在系统中统一使用UTC时间
2. 只在显示时转换为本地时间
3. 使用ISO 8601格式存储和传输时间
总结
Python的日期时间处理看似复杂,但掌握这几个核心模块和方法就能应对大多数场景:
time – 基础时间操作 | datetime – 高级日期处理 | pytz – 时区管理
记住:始终考虑时区,优先使用datetime模块,使用ISO格式进行存储和传输