下面我将从基础到高级,全面地介绍 Python 中时间戳的计算方法。

核心模块:time 和 datetime
Python 主要使用两个内置模块来处理时间:
time: 提供了各种与时间相关的函数,time.time()是获取当前时间戳最直接的方法。datetime: 提供了更高级、更面向对象的日期和时间操作接口,是日常开发中更常用的模块。
获取当前时间戳
这是最基本的一步。
使用 time 模块
time.time() 返回当前时间戳,这是一个浮点数,小数部分代表秒的小数部分。
import time
# 获取当前时间戳
current_timestamp = time.time()
print(f"当前时间戳 (time模块): {current_timestamp}")
# 示例输出: 当前时间戳 (time模块): 1678886400.123456
使用 datetime 模块
datetime 模块需要先获取当前的 UTC 时间或本地时间,然后转换为时间戳。

import datetime
# 方法1: 获取当前UTC时间并转换为时间戳
# 这是更推荐的做法,可以避免时区问题
utc_now = datetime.datetime.now(datetime.timezone.utc)
timestamp_utc = utc_now.timestamp()
print(f"当前UTC时间戳 (datetime模块): {timestamp_utc}")
# 示例输出: 当前UTC时间戳 (datetime模块): 1678886400.123456
# 方法2: 获取当前本地时间并转换为时间戳
# 注意:本地时间依赖于你的系统设置,可能在不同机器上结果不同
local_now = datetime.datetime.now()
timestamp_local = local_now.timestamp()
print(f"当前本地时间戳 (datetime模块): {timestamp_local}")
# 示例输出: 当前本地时间戳 (datetime模块): 1678886400.123456
最佳实践: 如果你的应用需要在全球范围内运行,强烈建议始终使用 UTC 时间 来避免时区混乱。
时间戳与 datetime 对象的相互转换
这是时间戳计算的核心,我们通常需要在机器可读的时间戳和人类可读的日期时间之间进行转换。
时间戳 -> datetime 对象
使用 datetime.datetime.fromtimestamp()。
import datetime
import time
# 假设有一个时间戳
timestamp = 1678886400
# 转换为本地时间的 datetime 对象
local_datetime = datetime.datetime.fromtimestamp(timestamp)
print(f"本地时间: {local_datetime}")
# 示例输出 (北京时间): 本地时间: 2025-03-15 16:00:00
# 转换为 UTC 时间的 datetime 对象
utc_datetime = datetime.datetime.fromtimestamp(timestamp, tz=datetime.timezone.utc)
print(f"UTC时间: {utc_datetime}")
# 示例输出: UTC时间: 2025-03-15 08:00:00+00:00
datetime 对象 -> 时间戳
使用 datetime 对象的 .timestamp() 方法。

import datetime
# 创建一个 datetime 对象 (默认是本地时间)
# 注意:创建时最好指定时区
local_dt = datetime.datetime(2025, 3, 15, 16, 0, 0)
timestamp_from_local = local_dt.timestamp()
print(f"从本地时间创建的时间戳: {timestamp_from_local}")
# 创建一个 UTC 时间的 datetime 对象 (推荐)
utc_dt = datetime.datetime(2025, 3, 15, 8, 0, 0, tzinfo=datetime.timezone.utc)
timestamp_from_utc = utc_dt.timestamp()
print(f"从UTC时间创建的时间戳: {timestamp_from_utc}")
# 验证它们是否相等
print(f"两个时间戳是否相等: {timestamp_from_local == timestamp_from_utc}")
# 输出: 两个时间戳是否相等: True
重要提示: 当你从一个不带时区的 datetime 对象(naive datetime)创建时间戳时,Python 会假设它是你的本地时间,这可能导致错误。始终在创建 datetime 对象时使用时区信息(timezone-aware)。
时间戳计算(核心应用)
一旦有了时间戳,计算就变得非常简单,因为它本质上就是一个数字。
计算时间差
import time
# 获取当前时间戳
ts1 = time.time()
# 模拟一个耗时5秒的操作
time.sleep(5)
# 再次获取时间戳
ts2 = time.time()
# 计算时间差(单位:秒)
time_difference = ts2 - ts1
print(f"时间差: {time_difference} 秒")
# 示例输出: 时间差: 5.004561900749206 秒
增加或减少时间
通过加减秒数来实现。
import datetime
import time
# 获取当前时间戳
now_timestamp = time.time()
# 增加一天 (86400 秒)
one_day_later_timestamp = now_timestamp + 86400
print(f"一天后的时间戳: {one_day_later_timestamp}")
# 减少一小时 (3600 秒)
one_hour_ago_timestamp = now_timestamp - 3600
print(f("一小时前的时间戳: {one_hour_ago_timestamp}")
# 将时间戳转换回可读格式
print("一天后的日期:", datetime.datetime.fromtimestamp(one_day_later_timestamp))
print("一小时前的日期:", datetime.datetime.fromtimestamp(one_hour_ago_timestamp))
计算两个日期之间的秒数
import datetime
# 定义两个日期
date_str1 = "2025-01-01"
date_str2 = "2025-01-02"
# 将字符串转换为带时区的 datetime 对象
dt1 = datetime.datetime.fromisoformat(date_str1).replace(tzinfo=datetime.timezone.utc)
dt2 = datetime.datetime.fromisoformat(date_str2).replace(tzinfo=datetime.timezone.utc)
# 计算时间差
delta = dt2 - dt1
# 获取总秒数
total_seconds = delta.total_seconds()
print(f"从 {date_str1} 到 {date_str2} 的总秒数: {total_seconds}")
# 输出: 从 2025-01-01 到 2025-01-02 的总秒数: 86400.0
.total_seconds() 方法非常有用,它会返回 timedelta 对象所代表的总秒数(包括天数、小时等转换过来的)。
处理时区(非常重要)
现代应用必须处理时区。datetime 模块(Python 3.2+)内置了时区支持。
import datetime
# 获取当前 UTC 时间,并附加 UTC 时区信息
utc_now = datetime.datetime.now(datetime.timezone.utc)
print(f"当前 UTC 时间: {utc_now}")
# 获取当前本地时间,并附加本地时区信息
# datetime.datetime.now() 本身是 "naive" (无时区) 的
# 可以使用 datetime.datetime.astimezone() 来为其附加时区信息
local_now = datetime.datetime.now().astimezone()
print(f"当前本地时间: {local_now}")
# 手动创建一个带时区的 datetime 对象
# 东八区 (北京时间)
tz_beijing = datetime.timezone(datetime.timedelta(hours=8))
beijing_time = datetime.datetime(2025, 1, 1, 12, 0, 0, tzinfo=tz_beijing)
print(f"北京时间: {beijing_time}")
# 使用 pytz 库 (更强大,但需要安装: pip install pytz)
# import pytz
# tz_sh = pytz.timezone('Asia/Shanghai')
# sh_time = datetime.datetime(2025, 1, 1, 12, 0, 0, tzinfo=tz_sh)
# print(f"上海时间: {sh_time}")
总结与最佳实践
- 首选
datetime模块: 对于大多数应用,datetime模块比time模块更直观、更强大。 - 坚持使用 UTC: 在存储、计算和传输时间时,始终使用 UTC 时间戳,只在需要向用户显示时才转换为本地时间。
- 使用时区感知对象: 在创建
datetime对象时,始终为其附加时区信息(使用tzinfo参数或astimezone()方法),以避免潜在的 bug。 - 转换要清晰:
datetime.fromtimestamp()是将时间戳转为datetime,而datetime_obj.timestamp()是将datetime转为时间戳。 - 计算很简单: 时间戳是数字,加减乘除等数学运算就是时间计算。
完整示例:计算未来某个时间点的时间戳
import datetime
def get_future_timestamp(days=0, hours=0, minutes=0):
"""
计算从现在起,N 天、N 小时、N 分钟后的 UTC 时间戳。
"""
# 获取当前 UTC 时间
now_utc = datetime.datetime.now(datetime.timezone.utc)
# 创建一个时间差对象
time_delta = datetime.timedelta(days=days, hours=hours, minutes=minutes)
# 计算未来的时间
future_time = now_utc + time_delta
# 转换为时间戳
future_timestamp = future_time.timestamp()
return future_timestamp
# 计算 3 天 2 小时后的时间戳
future_ts = get_future_timestamp(days=3, hours=2)
print(f"3天2小时后的时间戳是: {future_ts}")
# 将结果转换回可读的 UTC 时间
readable_future_time = datetime.datetime.fromtimestamp(future_ts, tz=datetime.timezone.utc)
print(f"对应的UTC时间是: {readable_future_time}") 