下面我将从基础到进阶,详细解释这个过程,并包含重要的注意事项。

基础方法:使用 datetime.timestamp()
这是最直接、最推荐的方法。timestamp() 方法会返回一个浮点数,表示从 1970年1月1日 00:00:00 UTC(Unix 纪元)到该 datetime 对象所表示时间的总秒数。
代码示例
import datetime
# 1. 创建一个 datetime 对象 (默认是本地时区)
# 注意:如果不指定时区,Python 会将其视为本地时区
dt_local = datetime.datetime(2025, 10, 27, 10, 30, 0)
# 2. 使用 timestamp() 方法转换为时间戳
timestamp_local = dt_local.timestamp()
print(f"本地时间: {dt_local}")
print(f"对应的时间戳: {timestamp_local}")
print("-" * 20)
# 3. 创建一个 UTC 时间的 datetime 对象
dt_utc = datetime.datetime(2025, 10, 27, 10, 30, 0, tzinfo=datetime.timezone.utc)
# 4. 将 UTC 时间转换为时间戳
timestamp_utc = dt_utc.timestamp()
print(f"UTC时间: {dt_utc}")
print(f"对应的时间戳: {timestamp_utc}")
输出结果
本地时间: 2025-10-27 10:30:00
对应的时间戳: 1698370200.0
--------------------
UTC时间: 2025-10-27 10:30:00+00:00
对应的时间戳: 1698370200.0
注意:如果你的本地时区是 UTC+8(比如北京时间),2025-10-27 10:30:00 这个本地时间点,对应的 UTC 时间是 2025-10-27 02:30:00,它俩对应的是同一个时间戳 0。
重要:时区问题(naive vs aware)
这是在使用 datetime 时最容易出错的地方。timestamp() 方法的行为取决于你的 datetime 对象是否包含时区信息。
- Naive (无时区信息):
datetime对象没有时区信息(如上面例子中的dt_local),Python 会默认它代表的是你本地计算机的时区,然后根据这个时区计算出 UTC 时间戳,这在不同时区的计算机上运行可能会导致结果不一致。 - Aware (有时区信息):
datetime对象有时区信息(如上面例子中的dt_utc),timestamp()方法会准确无误地将其转换为 UTC 时间戳,不受本地计算机时区的影响。
强烈建议:在处理时间戳时,始终使用 aware 的 datetime 对象,这样可以避免因时区不同而引发的 bug。

如何创建 aware 的 datetime 对象?
你需要从 datetime 模块中导入 timezone 类。
import datetime
# 创建一个带 UTC+8 时区的 datetime 对象 (例如北京时间)
tz_utc8 = datetime.timezone(datetime.timedelta(hours=8)) # 创建时区对象
dt_beijing = datetime.datetime(2025, 10, 27, 10, 30, 0, tzinfo=tz_utc8)
print(f"北京时间: {dt_beijing}")
print(f"对应的时间戳: {dt_beijing.timestamp()}")
# 创建一个带 UTC 时区的 datetime 对象
dt_utc = datetime.datetime(2025, 10, 27, 2, 30, 0, tzinfo=datetime.timezone.utc)
print(f"UTC时间: {dt_utc}")
print(f"对应的时间戳: {dt_utc.timestamp()}")
你会发现,2025-10-27 10:30:00 (北京时间) 和 2025-10-27 02:30:00 (UTC时间) 的时间戳是完全一样的。
进阶:从字符串创建 datetime 并转时间戳
在实际应用中,你通常需要从字符串(如数据库、API 或日志文件)解析出时间,然后转换为时间戳。
import datetime
# 字符串时间格式
time_str = "2025-10-27 10:30:00"
# 1. 先创建一个 naive 的 datetime 对象
dt_naive = datetime.datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S")
# 2. 为它指定时区,使其变为 aware 对象
# 假设这个字符串代表的是北京时间 (UTC+8)
tz = datetime.timezone(datetime.timedelta(hours=8))
dt_aware = dt_naive.replace(tzinfo=tz)
# 3. 转换为时间戳
timestamp = dt_aware.timestamp()
print(f"原始字符串: {time_str}")
print(f"带时区的 datetime: {dt_aware}")
print(f"最终时间戳: {timestamp}")
反向操作:时间戳转 datetime
了解如何转换回来也很重要。

datetime.fromtimestamp(timestamp): 将时间戳转换为本地时区的datetime对象。datetime.utcfromtimestamp(timestamp): 将时间戳转换为 UTC 时间的datetime对象(返回的是naive对象)。
import datetime
# 假设我们有一个时间戳
timestamp = 1698370200.0
# 1. 转换为本地时区的 datetime (naive)
dt_local = datetime.datetime.fromtimestamp(timestamp)
print(f"从时间戳转回本地时间: {dt_local}")
# 2. 转换为 UTC 时间的 datetime (naive)
dt_utc_naive = datetime.datetime.utcfromtimestamp(timestamp)
print(f"从时间戳转回 UTC 时间 (naive): {dt_utc_naive}")
# 3. 转换为带 UTC 时区的 datetime (aware)
# 先获取 UTC 时间,再添加时区信息
dt_utc_aware = datetime.datetime.utcfromtimestamp(timestamp).replace(tzinfo=datetime.timezone.utc)
print(f"从时间戳转回 UTC 时间 (aware): {dt_utc_aware}")
总结与最佳实践
| 任务 | 推荐方法 | 说明 |
|---|---|---|
datetime -> 时间戳 |
my_datetime.timestamp() |
首选方法。 |
创建 datetime |
始终为其指定时区 | 使用 datetime.timezone 或第三方库 pytz。 |
| 从字符串转换 | strptime + replace(tzinfo=...) |
确保 datetime 对象是 aware 的。 |
时间戳 -> datetime |
datetime.fromtimestamp() (本地) 或 datetime.utcfromtimestamp().replace(tzinfo=...) (UTC) |
根据需求选择,并注意时区。 |
核心要点:
- 时区是关键:
timestamp()的行为依赖于datetime对象是否有时区。 - 使用
aware对象:为了代码的可移植性和正确性,尽量使用带有时区信息的awaredatetime对象。 timestamp()返回的是 UTC 时间戳:无论你输入的是哪个时区的时间,最终得到的标准时间戳都是 UTC 纪元以来的秒数。
