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 提供了两个核心模块来处理日期和时间:datetimetime。它们像两把功能互补的瑞士军刀,适用于不同场景。

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))  

二、日期与时间的格式化与解析

格式化是将日期对象转换为字符串,而解析则是相反过程。掌握 strftimestrptime 是关键。

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
%H24小时制小时(00-23)15
%M分钟(00-59)30
%S秒(00-60)00
%pAM/PMPM
%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 日期和时间 的核心模块、格式化技巧、时区处理以及实际案例应用。掌握这些内容后,开发者可以更自信地处理时间序列分析、订单系统、日志记录等场景。建议读者通过以下方式巩固知识:

  1. 尝试将本文代码示例运行并修改参数
  2. 使用真实项目中的需求验证解决方案
  3. 探索 dateutil 等第三方库的高级功能

时间管理如同编程中的“隐形基础设施”,它可能不显眼,但一旦出错将引发连锁反应。希望本文能成为您在 Python 开发道路上的可靠指南。

最新发布