Python datetime模块详解:从基础用法到时区处理

顾星河
顾星河
发布时间:2026-10-14| 4人浏览过
原创

本文详细介绍Python标准库datetime模块的核心功能,涵盖获取当前时间、构造指定时间、与时间戳(timestamp)的相互转换、字符串与datetime对象的格式互转,以及利用timedelta进行时间加减运算。重点讲解UTC时间与本地时区的转换逻辑,包括tzinfo属性的设置和astimezone()方法的应用,帮助开发者准确处理跨时区的时间数据。

Python datetime模块简介

datetime是Python中用于处理日期和时间的标准库。

获取当前日期和时间

获取当前日期和时间

首先介绍如何获取当前的日期和时间信息。


>>> from datetime import datetime
>>> now = datetime.now() # 获取当前datetime
>>> print(now)
2015-05-18 16:28:07.198690
>>> print(type(now))
<class 'datetime.datetime'>

需要注意的是,datetime指的是整个模块,而datetime模块内部还包含一个名为datetime的类。只有通过from datetime import datetime语句导入后,才能直接使用datetime这个类。

如果仅使用import datetime导入模块,则在调用时必须使用完整名称datetime.datetime。

调用datetime.now()可以返回当前的日期和时间,其返回值的类型为datetime。

构造指定日期和时间

获取指定日期和时间

若要创建特定的日期和时间,可以直接通过参数构造一个datetime对象。


>>> from datetime import datetime
>>> dt = datetime(2015, 4, 19, 12, 20) # 用指定日期时间创建datetime
>>> print(dt)
2015-04-19 12:20:00

datetime与timestamp互转

datetime转换为timestamp

在计算机系统中,时间以数字形式存储。我们将1970年1月1日 00:00:00 UTC+00:00时区的时刻定义为epoch time,记为0(1970年之前的时间timestamp为负数)。当前时间即为相对于epoch time的秒数,称为timestamp。

可以理解为:


timestamp = 0 = 1970-1-1 00:00:00 UTC+0:00

对应的北京时间表示为:


timestamp = 0 = 1970-1-1 08:00:00 UTC+8:00

由此可见,timestamp的值与时区无关。因为一旦确定timestamp,其对应的UTC时间也就确定了,转换到任意时区的时间也是完全确定的。这就是计算机以timestamp存储当前时间的原因,因为全球各地校准后的计算机在任意时刻的timestamp都是相同的。

将一个datetime类型转换为timestamp,只需简单调用timestamp()方法。


>>> from datetime import datetime
>>> dt = datetime(2015, 4, 19, 12, 20) # 用指定日期时间创建datetime
>>> dt.timestamp() # 把datetime转换为timestamp
1429417200.0

注意Python中的timestamp是一个浮点数。若存在小数位,则表示毫秒数。

某些编程语言(如Java和JavaScript)使用整数表示毫秒数,此时只需将timestamp除以1000即可得到Python的浮点表示。

timestamp转换为datetime

要将timestamp转换为datetime,可使用datetime提供的fromtimestamp()方法。


>>> from datetime import datetime
>>> t = 1429417200.0
>>> print(datetime.fromtimestamp(t))
2015-04-19 12:20:00

需注意timestamp是浮点数,不含时区信息,而datetime包含时区。上述转换是在timestamp与本地时间之间进行。

本地时间指当前操作系统设定的时区。例如北京时区为东8区,则本地时间为:

2015-04-19 12:20:00

实际上即UTC+8:00时区的时间:

2015-04-19 12:20:00 UTC+8:00

此时格林威治标准时间(UTC+0:00)与北京时间相差8小时,因此UTC+0:00时区的时间应为:

2015-04-19 04:20:00 UTC+0:00

timestamp也可直接转换为UTC标准时区的时间。


>>> from datetime import datetime
>>> t = 1429417200.0
>>> print(datetime.fromtimestamp(t)) # 本地时间
2015-04-19 12:20:00
>>> print(datetime.utcfromtimestamp(t)) # UTC时间
2015-04-19 04:20:00

字符串与datetime格式转换

str转换为datetime

用户输入的日期和时间通常为字符串,处理前需先将str转换为datetime。通过指定日期和时间的格式化字符串,利用datetime.strptime()实现转换。


>>> from datetime import datetime
>>> cday = datetime.strptime('2015-6-1 18:19:59', '%Y-%m-%d %H:%M:%S')
>>> print(cday)
2015-06-01 18:19:59

字符串'%Y-%m-%d %H:%M:%S'规定了日期和时间部分的格式。详细说明请参考Python文档。

注意转换后的datetime对象不包含时区信息。

datetime转换为str

若已有datetime对象并需格式化为字符串显示,可通过strftime()方法转换为str,同样需要指定日期和时间的格式化字符串。


>>> from datetime import datetime
>>> now = datetime.now()
>>> print(now.strftime('%a, %b %d %H:%M'))
Mon, May 05 16:28

时间加减运算

datetime加减

对日期和时间进行加减即计算新的datetime。可直接使用+和-运算符,但需导入timedelta类。


>>> from datetime import datetime, timedelta
>>> now = datetime.now()
>>> now
datetime.datetime(2015, 5, 18, 16, 57, 3, 540997)
>>> now + timedelta(hours=10)
datetime.datetime(2015, 5, 19, 2, 57, 3, 540997)
>>> now - timedelta(days=1)
datetime.datetime(2015, 5, 17, 16, 57, 3, 540997)
>>> now + timedelta(days=2, hours=12)
datetime.datetime(2015, 5, 21, 4, 57, 3, 540997)

可见,使用timedelta可轻松计算前几天或后几天的时刻。

本地时间与UTC时区转换

本地时间转换为UTC时间

本地时间指系统设定时区的时间,如北京时间为UTC+8:00,而UTC时间指UTC+0:00时区的时间。

一个datetime类型具有时区属性tzinfo,但默认为None,因此无法区分该datetime所属时区,除非强制设置datetime的时区。


>>> from datetime import datetime, timedelta, timezone
>>> tz_utc_8 = timezone(timedelta(hours=8)) # 创建时区UTC+8:00
>>> now = datetime.now()
>>> now
datetime.datetime(2015, 5, 18, 17, 2, 10, 871012)
>>> dt = now.replace(tzinfo=tz_utc_8) # 强制设置为UTC+8:00
>>> dt
datetime.datetime(2015, 5, 18, 17, 2, 10, 871012, tzinfo=datetime.timezone(datetime.timedelta(0, 28800)))

若系统时区恰好为UTC+8:00,则上述代码正确;否则,不能强制设置为UTC+8:00时区。

时区转换

可先通过utcnow()获取当前UTC时间,再转换为任意时区的时间。


# 拿到UTC时间,并强制设置时区为UTC+0:00:
>>> utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)
>>> print(utc_dt)
2015-05-18 09:05:12.377316+00:00
# astimezone()将转换时区为北京时间:
>>> bj_dt = utc_dt.astimezone(timezone(timedelta(hours=8)))
>>> print(bj_dt)
2015-05-18 17:05:12.377316+08:00
# astimezone()将转换时区为东京时间:
>>> tokyo_dt = utc_dt.astimezone(timezone(timedelta(hours=9)))
>>> print(tokyo_dt)
2015-05-18 18:05:12.377316+09:00
# astimezone()将bj_dt转换时区为东京时间:
>>> tokyo_dt2 = bj_dt.astimezone(timezone(timedelta(hours=9)))
>>> print(tokyo_dt2)
2015-05-18 18:05:12.377316+09:00

时区转换的关键在于获取datetime时,需知其正确时区,然后强制设置时区作为基准。

利用带时区的datetime,通过astimezone()方法,可转换到任意时区。

注:并非必须从UTC+0:00时区转换到其他时区,任何带时区的datetime均可正确转换,例如上述bj_dt到tokyo_dt的转换。

总结

小结

datetime表示的时间需时区信息才能确定特定时间,否则仅视为本地时间。

若需存储datetime,最佳方法是转换为timestamp再存储,因为timestamp的值与时区完全无关。

以上就是详解python datetime模块的详细内容,更多关于python datetime模块的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。