当前位置:

首页 > 编程开发 > Python处理时间格式化的操作指南

Python处理时间格式化的操作指南

ISO8601是全球通用的日期时间规范。Python3通过time、datetime、calendar三大模块处理时间,其中datetime最常用。核心操作包括时间戳、datetime对象与字符串三种形式的互转,利用strftime和strptime进行格式化与解析。进阶功能涉及zoneinfo时区处理和timedelta日期运算,常用于生成带时间戳文件名、

ISO 8601这个标准,全称是《数据存储和交换形式·信息交换·日期和时间的表示方法》,由国际标准化组织(ISO)制定。说白了,它就是一套全球通用的日期和时间书写规范,定义了年、月、日、时、分、秒怎么表示。除了它,还有RFC 3339、RFC 2822等标准,但ISO 8601是应用最广的那个。

Python处理时间格式化的操作指南

# 东八区标准时间格式示例
1970-01-01T00:00:00+08

一、核心模块:Python3 时间处理的 3 大工具

Python3 处理时间,主要靠三个模块,各有各的看家本领,按需取用就行。

模块核心作用适用场景优点缺点
time底层时间操作(时间戳、休眠)快速获取时间戳、简单时间计算轻量、执行快格式化功能薄弱,不支持复杂日期运算
datetime日期时间类(datetime/date/time)大部分业务场景(格式转换、日期运算)功能全面、API 友好时区支持需配合 pytz/zoneinfo
calendar日历相关操作(月份日历、星期计算)日历生成、节假日判断专注日历场景日常格式化用不上,功能单一

建议:做业务开发,优先选 datetime 模块,它一个人就能搞定 90% 以上的时间格式化需求。如果涉及到复杂的时区切换,搭配 zoneinfo(Python3.9+ 内置)或 pytz 就可以了。

二、基础用法:时间格式化核心操作

在动手之前,得先搞清楚一个概念:Python 里的时间到底有几种“长相”?

1. 关键概念:时间的 3 种表示形式

说白了,Python 里的时间就这三种形态,我们做格式化,本质上就是在这三种形态之间来回切换:

  • 时间戳:一个浮点数,代表从 1970-01-01 00:00:00 UTC 到现在的秒数。
  • datetime 对象:datetime.datetime 类的实例,最灵活,能算能改能格式化。
  • 字符串:人类能看懂的时间,比如 2024-05-20 13:14:52。

2. 核心转换:3 种形式互转(高频)

(1)获取当前时间(3 种形式)

import time
from datetime import datetime

# 1. 获取时间戳(秒级)
timestamp = time.time()
print(f"秒级时间戳:{timestamp}")  # 输出:1716202492.123456

# 2. 获取毫秒级时间戳(业务常用)
ms_timestamp = int(time.time() * 1000)
print(f"毫秒级时间戳:{ms_timestamp}")  # 输出:1716202492123

# 3. 获取 datetime 对象(本地时间)
local_dt = datetime.now()
print(f"本地时间 datetime 对象:{local_dt}")  # 输出:2024-05-20 13:14:52.123456

# 4. 获取 UTC 时间 datetime 对象
utc_dt = datetime.utcnow()
print(f"UTC 时间 datetime 对象:{utc_dt}")  # 输出:2024-05-20 05:14:52.123456

(2)datetime 对象 → 字符串(格式化核心)

用 strftime(format) 方法,你可以按自己的意愿拼装时间格式。这里有一张常用格式化符的速查表:

格式化符说明示例
%Y4 位年份2024
%m2 位月份(01-12)05
%d2 位日期(01-31)20
%H24 小时制(00-23)13
%I12 小时制(01-12)01
%M2 位分钟(00-59)14
%S2 位秒数(00-59)52
%w星期(0-6,0 为周日)1(周一)
%W当年第几周(00-53)20
%p上午 / 下午(AM/PM,仅 12 小时制)PM

示例:

from datetime import datetime

dt = datetime.now()

# 格式1:年月日 时分秒(最常用)
str1 = dt.strftime("%Y-%m-%d %H:%M:%S")
print(str1)  # 输出:2024-05-20 13:14:52

# 格式2:年月日(无时间)
str2 = dt.strftime("%Y/%m/%d")
print(str2)  # 输出:2024/05/20

# 格式3:带星期和上午/下午
str3 = dt.strftime("%Y-%m-%d %A %I:%M:%S %p")
print(str3)  # 输出:2024-05-20 Monday 01:14:52 PM

# 格式4:自定义分隔符(如下划线)
str4 = dt.strftime("%Y_%m_%d_%H%M%S")
print(str4)  # 输出:2024_05_20_131452(适合文件名)

(3)字符串 → datetime 对象(解析时间)

反过来,用 strptime(string, format) 方法就能把字符串解析成 datetime 对象。这里有个坑:format 必须和字符串格式完全一致,差一个字符都会报错。

示例:

from datetime import datetime

# 示例1:解析标准格式字符串
str_time1 = "2024-05-20 13:14:52"
dt1 = datetime.strptime(str_time1, "%Y-%m-%d %H:%M:%S")
print(f"解析结果:{dt1},类型:{type(dt1)}")  # 输出:2024-05-20 13:14:52,类型:.datetime'>

# 示例2:解析无分隔符格式
str_time2 = "20240520131452"
dt2 = datetime.strptime(str_time2, "%Y%m%d%H%M%S")
print(f"解析结果:{dt2}")  # 输出:2024-05-20 13:14:52

# 示例3:解析带中文的格式
str_time3 = "2024年05月20日 13时14分52秒"
dt3 = datetime.strptime(str_time3, "%Y年%m月%d日 %H时%M分%S秒")
print(f"解析结果:{dt3}")  # 输出:2024-05-20 13:14:52

(4)时间戳 ↔ datetime 对象

import time
from datetime import datetime

# 1. 时间戳 → datetime 对象(本地时间)
timestamp = 1716202492.123456
dt_local = datetime.fromtimestamp(timestamp)
print(f"本地时间:{dt_local}")  # 输出:2024-05-20 13:14:52.123456

# 2. 时间戳 → datetime 对象(UTC 时间)
dt_utc = datetime.utcfromtimestamp(timestamp)
print(f"UTC 时间:{dt_utc}")  # 输出:2024-05-20 05:14:52.123456

# 3. datetime 对象 → 时间戳
dt = datetime.now()
timestamp = dt.timestamp()
print(f"时间戳:{timestamp}")  # 输出:1716202492.123456

三、进阶技巧:时区处理与日期运算

基础操作掌握了,接下来就要面对两个更现实的问题:时区和日期加减。

1. 时区处理(Python3.9+ 推荐zoneinfo)

在 Python3.9 之前,时区处理得靠第三方库 pytz。从 3.9 版本开始,官方内置了 zoneinfo,用起来更方便,而且会自动处理夏令时。

(1)获取指定时区的当前时间

from datetime import datetime
from zoneinfo import ZoneInfo  # Python3.9+ 内置

# 1. 获取纽约时间(UTC-4/UTC-5,自动适配夏令时)
ny_tz = ZoneInfo("America/New_York")
ny_dt = datetime.now(ny_tz)
print(f"纽约时间:{ny_dt.strftime('%Y-%m-%d %H:%M:%S')}")  # 输出:2024-05-20 01:14:52

# 2. 获取东京时间(UTC+9)
tokyo_tz = ZoneInfo("Asia/Tokyo")
tokyo_dt = datetime.now(tokyo_tz)
print(f"东京时间:{tokyo_dt.strftime('%Y-%m-%d %H:%M:%S')}")  # 输出:2024-05-20 14:14:52

# 3. 获取北京时间(UTC+8)
bj_tz = ZoneInfo("Asia/Shanghai")
bj_dt = datetime.now(bj_tz)
print(f"北京时间:{bj_dt.strftime('%Y-%m-%d %H:%M:%S')}")  # 输出:2024-05-20 13:14:52

(2)时区转换(如 UTC 转北京时间)

from datetime import datetime
from zoneinfo import ZoneInfo

# 1. 创建 UTC 时间对象
utc_dt = datetime(2024, 5, 20, 5, 14, 52, tzinfo=ZoneInfo("UTC"))
print(f"UTC 时间:{utc_dt}")  # 输出:2024-05-20 05:14:52+00:00

# 2. 转换为北京时间(UTC+8)
bj_dt = utc_dt.astimezone(ZoneInfo("Asia/Shanghai"))
print(f"北京时间:{bj_dt.strftime('%Y-%m-%d %H:%M:%S')}")  # 输出:2024-05-20 13:14:52

2. 日期运算(timedelta类)

想给日期加几天、减几小时?timedelta 是你的好帮手。它自动处理月份天数和闰年,不用你操心。

示例:

from datetime import datetime, timedelta

now = datetime.now()

# 1. 加 3 天
future_3d = now + timedelta(days=3)
print(f"3 天后:{future_3d.strftime('%Y-%m-%d')}")  # 输出:2024-05-23

# 2. 减 1 小时 30 分钟
past_1h30m = now - timedelta(hours=1, minutes=30)
print(f"1 小时 30 分钟前:{past_1h30m.strftime('%Y-%m-%d %H:%M')}")  # 输出:2024-05-20 11:44

# 3. 计算两个日期的差值
date1 = datetime(2024, 5, 20)
date2 = datetime(2024, 5, 10)
diff = date1 - date2
print(f"日期差值:{diff.days} 天")  # 输出:10 天
print(f"总秒数:{diff.total_seconds()} 秒")  # 输出:864000.0 秒

# 4. 加 1 个月(timedelta 不支持 months,需用 relativedelta)
# 安装:pip install python-dateutil
from dateutil.relativedelta import relativedelta
future_1m = now + relativedelta(months=1)
print(f"1 个月后:{future_1m.strftime('%Y-%m-%d')}")  # 输出:2024-06-20

四、场景:格式化时间的高频用法

理论说再多,不如直接看几个实际场景。下面这些都是日常开发中很常见的需求。

1. 生成带时间戳的文件名(日志 / 备份场景)

from datetime import datetime

# 生成格式:20240520_131452_backup.zip
filename = f"{datetime.now().strftime('%Y%m%d_%H%M%S')}_backup.zip"
print(filename)  # 输出:20240520_131452_backup.zip

2. 计算程序运行时间

import time
from datetime import datetime

# 方法1:用 time 模块(简洁)
start_time = time.time()
# 模拟程序运行(如循环)
for _ in range(1000000):
   pass
end_time = time.time()
print(f"程序运行时间:{end_time - start_time:.6f} 秒")  # 输出:0.031250 秒

# 方法2:用 datetime 模块(可读性强)
start_dt = datetime.now()
for _ in range(1000000):
   pass
end_dt = datetime.now()
diff = end_dt - start_dt
print(f"程序运行时间:{diff.total_seconds():.6f} 秒")  # 输出:0.031250 秒

3. 格式化数据库时间(ORM 场景)

从数据库里查出来的时间,通常是 datetime 对象,需要格式化后再展示给用户。

from datetime import datetime
import pymysql

# 连接数据库(示例)
conn = pymysql.connect(host="localhost", user="root", password="123456", db="test")
cursor = conn.cursor()

# 查询数据库中的时间字段(假设字段 create_time 为 datetime 类型)
cursor.execute("SELECT create_time FROM user WHERE id = 1")
result = cursor.fetchone()
if result:
   db_time = result[0]  # 数据库返回的是 datetime 对象
   # 格式化输出
   formatted_time = db_time.strftime("%Y-%m-%d %H:%M:%S")
   print(f"用户创建时间:{formatted_time}")  # 输出:2024-05-20 13:14:52

cursor.close()
conn.close()

4. 处理前端传递的时间字符串

前端传过来的时间,往往是字符串格式,后端得先解析,才能做运算或存库。

from datetime import datetime

# 前端传递的时间字符串
front_time_str = "2024-05-20T13:14:52"  # 常见于 JSON 数据

# 解析为 datetime 对象
dt = datetime.strptime(front_time_str, "%Y-%m-%dT%H:%M:%S")

# 加 1 天後返回给前端
next_day_dt = dt + timedelta(days=1)
front_response_str = next_day_dt.strftime("%Y-%m-%dT%H:%M:%S")
print(f"返回前端的时间:{front_response_str}")  # 输出:2024-05-21T13:14:52

五、避坑指南:常见问题与解决方案

时间处理看着简单,但陷阱不少。这里总结几个高频的坑,提前了解能省不少 debug 的时间。

1. 问题:格式化符大小写混淆(如%mvs%M)

错误示例:把「月份」的 %m 和「分钟」的 %M 混用了,结果解析出来的时间完全不对。

解决方案:牢记核心格式化符的大小写:

  • 大写:%Y(年份)、%M(分钟)、%H(24 小时制)、%S(秒);
  • 小写:%y(两位年份)、%m(月份)、%h(12 小时制,同 %I)、%s(无意义,别用)。

2. 问题:字符串与 format 不匹配(ValueError)

错误示例:datetime.strptime("2024-05-20", "%Y/%m/%d")(分隔符不一致,一个是横杠,一个是斜杠)。

解决方案:

  • 严格保证 strptime 的第二个参数与字符串格式完全一致,分隔符、位数、单位都不能错。
  • 如果字符串格式不固定,可以先做预处理,比如统一替换分隔符:
str_time = "2024-05-20"
str_time = str_time.replace("-", "/")  # 统一分隔符
dt = datetime.strptime(str_time, "%Y/%m/%d")

3. 问题:时区缺失导致的时间偏差

现象:本地时间存到数据库后,再查出来发现少了 8 小时。这通常是因为本地时间没有带上时区信息,被系统当成了 UTC 时间处理。

解决方案:

  • 存储时间时,统一使用 UTC 时间,从根本上避免时区差异。
  • 前端展示时,再根据用户的时区做转换。
  • 数据库字段,如果能选,建议使用 TIMESTAMP WITH TIME ZONE(比如 PostgreSQL),或者用 DATETIME 但自己手动处理时区(比如 MySQL)。

4. 问题:Python3.9 以下不支持zoneinfo

解决方案:

  • 升级 Python 到 3.9+,这是最推荐的做法。
  • 如果暂时不能升级,就用 pytz 来替代:
import pytz
from datetime import datetime

bj_tz = pytz.timezone("Asia/Shanghai")
bj_dt = datetime.now(bj_tz)
print(bj_dt.strftime("%Y-%m-%d %H:%M:%S"))  # 输出:2024-05-20 13:14:52

5. 问题:timedelta不支持月份 / 年份运算

  • 原因:说白了,月份天数不固定(28、29、30、31),年份还有闰年,timedelta 这个“老实人”搞不定这么复杂的情况。
  • 解决方案:用 python-dateutil 这个库里的 relativedelta,它专门处理这种需求。
from dateutil.relativedelta import relativedelta
from datetime import datetime

now = datetime.now()
next_year = now + relativedelta(years=1)  # 加 1 年
last_month = now - relativedelta(months=1)  # 减 1 个月
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发 Python
相关文章 更多
codekit环境配置指南从安装到环境搭建完整教程
codekit环境配置指南从安装到环境搭建完整教程

详解 CodeKit 在 macOS 下的安装步骤、项目导入方法、Sass与JavaScript编译设置及浏览器自动刷新功能,助您快速搭建高效的前端开发环境。

codex安装windows 命令行完整操作教程
codex安装windows 命令行完整操作教程

详解Windows环境下安装OpenAI Codex CLI的步骤,包括WSL环境检查、Node.js/npm配置、npm全局安装命令及首次启动验证,适合开发者快速上手。

NativeRest环境配置要求与完整操作教程
NativeRest环境配置要求与完整操作教程

学习如何配置 NativeRest REST API 客户端。涵盖 Windows/macOS/Linux 安装后的工作区创建、环境变量管理、请求编辑及响应查看步骤,帮助开发者快速完成基础环境搭建与连通性测试。

CSS设置透明度的注意事项有哪些?opacity属性详解
CSS设置透明度的注意事项有哪些?opacity属性详解

深入解析CSS中设置透明度的核心属性opacity,剖析子元素继承、事件穿透、层叠上下文等关键注意事项,并提供与rgba、hsla的实用选型对比。

flutter页面传值到后台的方法及示例代码
flutter页面传值到后台的方法及示例代码

flutter页面传值到后台的完整实现方法及示例代码,帮助读者快速掌握相关技术要点。

Java 8至21新特性代码写法对比:Lambda、Record与Switch
Java 8至21新特性代码写法对比:Lambda、Record与Switch

本文通过具体的旧版与新版代码对比,详细剖析Java 8引入的Lambda表达式、Java 14/16引入的Record类,以及Java 12至21逐步演进完善的Switch表达式与模式匹配,展示代码简化路径与避坑要点。

AI智能体开发培训课程学什么及实战内容介绍
AI智能体开发培训课程学什么及实战内容介绍

系统梳理AI智能体开发培训的核心知识模块、技术栈选型与典型实战项目,解析低代码平台与纯代码框架的差异,提供从零构建可落地智能体的完整学习与实施路径。

Java子类未实现抽象方法编译错误修复指南
Java子类未实现抽象方法编译错误修复指南

针对Java开发中常见的“子类未实现抽象方法”编译错误,深入分析报错原因,提供重写实现、声明抽象子类两种标准修复路径,并总结参数签名、访问修饰符等典型避坑要点。

解决PHP递归报错:max_nesting_level限制与内存溢出处理
解决PHP递归报错:max_nesting_level限制与内存溢出处理

遇到PHP递归报错时,不要盲目调大max_nesting_level。本文教你区分Xdebug限制、内存耗尽和正则递归错误,提供代码级的终止条件优化与迭代替代方案,彻底解决栈溢出问题。

PHP递归中static变量与引用传递的常见陷阱及调试
PHP递归中static变量与引用传递的常见陷阱及调试

本文分析PHP递归中static变量导致的状态污染及引用传递引发的共享数据修改问题。提供具体的代码复现、缓存键设计建议及调试打印技巧,帮助开发者避免隐蔽的逻辑错误。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

WINDOWS 更多
3dmax(3ds max)
3dmax(3ds max)
Windows

Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。