Python3 日期和时间(一文讲透)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
- 《从零手撸:仿小红书(微服务架构)》 已完结,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
前言
在编程开发中,日期和时间的处理是一个高频需求场景。无论是记录用户注册时间、计算订单有效期,还是分析历史数据的时间序列,都需要精准操作日期和时间。对于 Python 开发者而言,掌握 Python3 日期和时间 的核心模块和技巧,是提升代码效率与健壮性的关键。本文将从基础概念到高级应用,通过代码示例和实际案例,帮助读者系统性地理解这一主题。
一、Python3 日期和时间的核心模块
Python 提供了两个核心模块来处理日期和时间:datetime
和 time
。它们像两把功能互补的瑞士军刀,适用于不同场景。
1.1 datetime 模块:面向对象的日期操作
datetime
模块以面向对象的方式封装了日期和时间的逻辑,适合复杂的时间计算。其核心类包括:
datetime
:表示日期和时间的组合(如 2023-10-01 15:30:00)date
:仅包含日期信息(如 2023-10-01)time
:仅包含时间信息(如 15:30:00)timedelta
:表示时间间隔(如 2天或 3小时)
示例:创建日期对象
from datetime import datetime, date, time
now = datetime.now()
print("当前时间:", now) # 输出: 2023-10-01 15:30:00.123456
custom_date = date(2023, 10, 1)
custom_time = time(15, 30, 0)
custom_dt = datetime(2023, 10, 1, 15, 30, 0)
print("自定义日期:", custom_date) # 输出: 2023-10-01
print("自定义时间:", custom_time) # 输出: 15:30:00
1.2 time 模块:与操作系统交互的底层接口
time
模块更贴近操作系统的底层时间功能,常用于时间戳操作或跨语言兼容场景。例如:
time()
:获取当前时间的时间戳(自1970-01-01以来的秒数)sleep()
:暂停程序执行指定秒数
示例:时间戳与时间转换
import time
timestamp = time.time()
print("当前时间戳:", timestamp) # 输出: 1696150200.123456
local_time = time.localtime(timestamp)
print("本地时间:", time.strftime("%Y-%m-%d %H:%M:%S", local_time))
二、日期与时间的格式化与解析
格式化是将日期对象转换为字符串,而解析则是相反过程。掌握 strftime
和 strptime
是关键。
2.1 格式化:datetime → 字符串
使用 strftime
方法,通过格式代码(如 %Y
表示年份)控制输出格式。
示例:日期格式化
from datetime import datetime
dt = datetime(2023, 10, 1, 15, 30)
formatted_str = dt.strftime("%Y-%m-%d %H:%M")
print(formatted_str) # 输出: 2023-10-01 15:30
friendly_str = dt.strftime("%B %dst, %Y %I:%M %p")
print(friendly_str) # 输出: October 1st, 2023 03:30 PM
2.2 解析:字符串 → datetime
使用 strptime
方法将字符串解析为 datetime
对象,格式代码需与输入严格匹配。
示例:日期解析
date_str = "2023-10-01 15:30:00"
parsed_dt = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
print(parsed_dt) # 输出: 2023-10-01 15:30:00
2.3 常用格式代码表
格式代码 | 含义 | 示例输出 |
---|---|---|
%Y | 四位年份 | 2023 |
%m | 两位月份(01-12) | 10 |
%d | 两位日期(01-31) | 01 |
%H | 24小时制小时(00-23) | 15 |
%M | 分钟(00-59) | 30 |
%S | 秒(00-60) | 00 |
%p | AM/PM | PM |
%B | 完整月份名称 | October |
三、时区处理与国际化
时区问题是全球化应用的常见痛点。Python 的 pytz
库或 Python3.9+ 的 zoneinfo
模块可解决这一问题。
3.1 时区转换示例
from datetime import datetime
import pytz
utc_time = datetime.now(pytz.utc)
print("UTC 时间:", utc_time) # 输出: 2023-10-01 15:30:00+00:00
beijing_time = utc_time.astimezone(pytz.timezone("Asia/Shanghai"))
print("北京时间:", beijing_time) # 输出: 2023-10-01 23:30:00+08:00
3.2 常见时区操作技巧
- 使用
tzinfo
参数指定时区 - 转换时区前确保对象是“时区感知型”(aware)
- 避免直接使用本地时区(localtime),优先用 UTC 标准时间
四、实战案例:电商订单系统
假设我们正在开发一个电商系统,需要记录订单创建时间、计算配送时间,并生成订单有效期。
4.1 记录订单时间
from datetime import datetime
class Order:
def __init__(self):
self.create_time = datetime.now() # 记录订单创建时间
self.expiry_time = self.create_time + timedelta(days=7) # 7天后过期
order = Order()
print("订单创建时间:", order.create_time.strftime("%Y-%m-%d %H:%M"))
print("订单有效期至:", order.expiry_time.strftime("%Y-%m-%d"))
4.2 计算配送时间
def calculate_delivery_time(create_time):
"""根据订单创建时间计算预计送达时间(3个工作日后)"""
return create_time + timedelta(days=3)
delivery_time = calculate_delivery_time(order.create_time)
print("预计送达时间:", delivery_time.strftime("%Y-%m-%d"))
五、常见问题与解决方案
5.1 时间戳与datetime互转
from datetime import datetime
timestamp = 1696150200
dt = datetime.fromtimestamp(timestamp)
timestamp_back = dt.timestamp()
5.2 时间间隔计算
start = datetime(2023, 10, 1)
end = datetime(2023, 10, 8)
delta = end - start
print("天数差:", delta.days) # 输出: 7
print("总秒数:", delta.total_seconds()) # 输出: 604800.0
5.3 处理闰年与月份边界
def is_leap_year(year):
return (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)
print(is_leap_year(2020)) # 输出: True
结论
通过本文,我们系统地学习了 Python3 日期和时间 的核心模块、格式化技巧、时区处理以及实际案例应用。掌握这些内容后,开发者可以更自信地处理时间序列分析、订单系统、日志记录等场景。建议读者通过以下方式巩固知识:
- 尝试将本文代码示例运行并修改参数
- 使用真实项目中的需求验证解决方案
- 探索
dateutil
等第三方库的高级功能
时间管理如同编程中的“隐形基础设施”,它可能不显眼,但一旦出错将引发连锁反应。希望本文能成为您在 Python 开发道路上的可靠指南。