当前位置: 首页 > news >正文

lesson13:Python的datetime模块

目录

一、模块核心组件

1. date类:处理日期(年/月/日)

2. time类:处理时间(时/分/秒/微秒)

3. datetime类:日期时间组合(最常用)

4. timedelta类:时间间隔计算

二、格式化日期时间

三、时区处理进阶

使用zoneinfo(Python 3.9+标准库)

时区数据库

四、实际应用场景

1. 计算程序运行时间

2. 生成时间序列数据

3. 日志时间格式化

五、常见问题与解决方案

1. 日期比较大小

2. 处理闰年/闰月

3. 性能优化

总结


一、模块核心组件

datetime模块主要包含以下四个核心类,覆盖了日期时间处理的几乎所有场景:

1. date类:处理日期(年/月/日)

  • 创建方式date(year, month, day),需注意参数合法性(如月份1-12,日期不超过当月天数)
  • 常用属性.year .month .day
  • 实用方法
    • today():获取当前本地日期
    • fromtimestamp(timestamp):从时间戳创建日期对象
    • weekday():返回星期几(0=周一,6=周日)
    • isoweekday():返回ISO标准星期几(1=周一,7=周日)
from datetime import date
today = date.today()
print(today) # 输出:2025-07-14
print(today.strftime("%Y年%m月%d日 星期%w")) # 格式化输出

2. time类:处理时间(时/分/秒/微秒)

  • 创建方式time(hour=0, minute=0, second=0, microsecond=0)
  • 注意事项:时间对象不包含日期信息,也不处理时区
  • 常用方法strftime() 格式化时间字符串

3. datetime类:日期时间组合(最常用)

  • 创建方式datetime(year, month, day, hour=0, minute=0, ...)
  • 核心方法
    • now():获取当前本地日期时间
    • utcnow():获取当前UTC日期时间
    • strptime(date_string, format):从字符串解析为datetime对象
    • timestamp():转换为Unix时间戳(秒级浮点数)
from datetime import datetime
dt = datetime.now()
print(dt.strftime("%Y-%m-%d %H:%M:%S.%f")) # 带微秒的完整时间
# 字符串转datetime
dt_str = "2025-01-01 12:30:45"
dt = datetime.strptime(dt_str, "%Y-%m-%d %H:%M:%S")

4. timedelta类:时间间隔计算

  • 作用:表示两个日期/时间之间的差值
  • 创建方式timedelta(days=0, seconds=0, microseconds=0, hours=0, minutes=0, weeks=0)
  • 常用操作:支持与datetime对象的加减运算
from datetime import timedelta
# 计算3天后的日期
future = datetime.now() + timedelta(days=3)
# 计算两个日期差
delta = future - datetime.now()
print(delta.days, delta.total_seconds()) # 天数和总秒数

二、格式化日期时间

strftime()方法和strptime()方法是处理日期时间字符串的核心,需要熟练掌握格式化指令:

指令含义示例
%Y4位年份2025
%m2位月份(01-12)07
%d2位日期(01-31)14
%H24小时制小时(00-23)15
%M分钟(00-59)45
%S秒(00-59)30
%f微秒(000000-999999)123456
%a星期缩写Mon
%A星期全称Monday
%b月份缩写Jul
%B月份全称July

实用示例

# 生成带星期的日期字符串
dt = datetime.now()
print(dt.strftime("%Y年%m月%d日 %A %H:%M")) # 2025年07月14日 Monday 15:45

三、时区处理进阶

datetime模块原生不支持时区,但可通过pytz库或Python 3.9+的zoneinfo模块扩展:

使用zoneinfo(Python 3.9+标准库)

from datetime import datetime
from zoneinfo import ZoneInfo # 注意区分大小写# 创建带时区的datetime对象
ny_time = datetime.now(ZoneInfo("America/New_York"))
bj_time = datetime.now(ZoneInfo("Asia/Shanghai"))# 时区转换
dt_utc = datetime.utcnow().replace(tzinfo=ZoneInfo("UTC"))
dt_bj = dt_utc.astimezone(ZoneInfo("Asia/Shanghai"))

时区数据库

  • 可用时区列表可通过zoneinfo.available_timezones()查看
  • 常用时区:Asia/Shanghai(北京时间)、UTC(协调世界时)、America/New_York(纽约时间)

四、实际应用场景

1. 计算程序运行时间

import time
from datetime import datetimestart = datetime.now()
# 执行耗时操作
time.sleep(2)
end = datetime.now()
print(f"程序运行时间:{(end - start).total_seconds():.2f}秒")

2. 生成时间序列数据

def generate_date_range(start_date, end_date):
"""生成日期范围内的所有日期"""
delta = timedelta(days=1)
current = start_date
while current <= end_date:
yield current
current += delta# 使用示例
start = date(2025, 1, 1)
end = date(2025, 1, 10)
for dt in generate_date_range(start, end):
print(dt)

3. 日志时间格式化

def log(message):
"""带时间戳的日志函数"""
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"[{timestamp}] {message}")log("系统启动成功") # [2025-07-14 15:45:30] 系统启动成功

五、常见问题与解决方案

1. 日期比较大小

直接使用比较运算符(<, >, ==)即可,datetime对象支持自然排序

2. 处理闰年/闰月

date类会自动处理月份天数,无需手动判断:

# 2024是闰年,2月有29天
leap_day = date(2024, 2, 29)
next_year = leap_day.replace(year=2025) # 自动调整为2025-03-01

3. 性能优化

  • 大量日期处理时,优先使用datetime而非time模块
  • 解析固定格式字符串时,datetime.strptime()比正则表达式更高效

总结

datetime模块提供了Python日期时间处理的完整解决方案,掌握它能让你轻松应对各类时间相关任务。建议进一步学习:

  • 进阶库dateutil(提供更强大的相对时间计算和解析)、pendulum(更友好的时区处理)
  • 应用场景:定时任务调度(结合schedule库)、数据分析中的时间序列处理(结合pandas
  • 最佳实践:存储时间时优先使用UTC时间,展示时再转换为本地时区

通过灵活运用datetime模块,你可以在日志记录、数据统计、定时任务等场景中写出更专业、更健壮的代码。

http://www.dtcms.com/a/278596.html

相关文章:

  • 登录校验与异常处理(web后端笔记第三期)
  • NAT原理与实验指南:网络地址转换技术解析与实践
  • 中国AI应用“三分天下”:国企成主力、中小企偏订阅、C端仍在观望
  • 使用axios向服务器请求信息并渲染页面
  • TCP心跳机制详解
  • 【Linux系统】进程切换 | 进程调度——O(1)调度队列
  • 如何在服务器上运行一个github项目
  • VMware 虚拟机 Ubuntu 无法主机与虚拟机之间复制粘贴的详细解决方案
  • ZLMediaKit流媒体服务器:不用docker -java源码部署Linux问题处理
  • day20 力扣235. 二叉搜索树的最近公共祖先 力扣701.二叉搜索树中的插入操作 力扣450.删除二叉搜索树中的节点
  • 8:从USB摄像头把声音拿出来--ALSA大佬登场!
  • Bash常见条件语句和循环语句
  • rk3588平台USB 3.0 -OAK深度相机适配方法
  • springboot 好处
  • [Nagios Core] 事件调度 | 检查执行 | 插件与进程
  • JAVA 设计模式 适配器
  • 八、nginx搭建,实现vue跳转nginx跳转gateway
  • Java设计模式(java design patterns)
  • 概率论与数理统计(二)
  • Maven+Spring
  • 在Maven多模块项目中进行跨模块的SpringBoot单元测试
  • 【橘子分布式】Thrift RPC(理论篇)
  • vscode 安装 esp ide环境
  • LeetCode-283. 移动零(Java)
  • 【STM32】什么在使能寄存器或外设之前必须先打开时钟?
  • Pandas-特征工程详解
  • 零基础入门Java虚拟机与单例模式:新手友好教程
  • Modbus 开发工具实战:ModScan32 与 Wireshark 抓包分析(二)
  • VSCODE 选中多行 需要同时按住alt键才可以
  • ShenYu实战、问题记录