在 Python 中生成时间戳(timestamp)非常简单,主要使用 time 和 datetime 这两个标准库,时间戳是指从 1970年1月1日 00:00:00 UTC(也称为 Unix 纪元)到某个时间点所经过的秒数。
下面我将详细介绍几种常用方法,并附上代码示例。
使用 time 模块(最常用)
time 模块是 Python 中处理时间最基础、最直接的模块。
获取当前时间戳
使用 time.time() 可以直接获取当前时间的 UTC 时间戳,这个值是一个浮点数,小数部分代表毫秒。
import time
# 获取当前时间戳(UTC)
current_timestamp = time.time()
print(f"当前时间戳: {current_timestamp}")
print(f"类型: {type(current_timestamp)}")
# 示例输出:
# 当前时间戳: 1678886400.123456
# 类型: <class 'float'>
将时间戳转换为可读时间(时间元组)
time.localtime(timestamp) 可以将一个时间戳转换为本地时间的 struct_time 对象(也称为时间元组)。
import time
# 假设有一个时间戳
timestamp = 1678886400.123456
# 将时间戳转换为本地时间的 struct_time 对象
local_time_tuple = time.localtime(timestamp)
print(f"本地时间元组: {local_time_tuple}")
print(f"年: {local_time_tuple.tm_year}")
print(f"月: {local_time_tuple.tm_mon}")
print(f"日: {local_time_tuple.tm_mday}")
print(f"时: {local_time_tuple.tm_hour}")
print(f"分: {local_time_tuple.tm_min}")
print(f"秒: {local_time_tuple.tm_sec}")
# 示例输出:
# 本地时间元组: time.struct_time(tm_year=2025, tm_mon=3, tm_mday=15, tm_hour=10, tm_min=40, tm_sec=0, tm_wday=2, tm_yday=74, tm_isdst=0)
# 年: 2025
# 月: 3
# 日: 15
# 时: 10
# 分: 40
# 秒: 0
将时间元组格式化为字符串
time.strftime(format, time_tuple) 可以将时间元组格式化为自定义的字符串。
import time
timestamp = 1678886400
local_time_tuple = time.localtime(timestamp)
# 格式化为 "YYYY-MM-DD HH:MM:SS" 格式
formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", local_time_tuple)
print(f"格式化后的时间: {formatted_time}")
# 格式化为其他格式
formatted_time_2 = time.strftime("%Y/%m/%d %H-%M-%S", local_time_tuple)
print(f"另一种格式: {formatted_time_2}")
# 示例输出:
# 格式化后的时间: 2025-03-15 10:40:00
# 另一种格式: 2025/03/15 10-40-00
常用格式化符号:
%Y: 四位数的年份 (e.g., 2025)%m: 两位数的月份 (01-12)%d: 两位数的日期 (01-31)%H: 24小时制的小时 (00-23)%M: 分钟 (00-59)%S: 秒 (00-59)
使用 datetime 模块(更现代、更面向对象)
datetime 模块提供了更高级、更直观的日期和时间处理功能。
获取当前时间戳
datetime 模块本身不直接生成时间戳,但可以轻松地将 datetime 对象转换为时间戳。
import datetime
# 1. 获取当前的 datetime 对象(默认是本地时间)
now = datetime.datetime.now()
print(f"当前 datetime 对象: {now}")
print(f"类型: {type(now)}")
# 2. 将 datetime 对象转换为时间戳
timestamp_from_datetime = now.timestamp()
print(f"从 datetime 对象生成的时间戳: {timestamp_from_datetime}")
# 3. 获取当前的 UTC datetime 对象并转换为时间戳
now_utc = datetime.datetime.utcnow()
timestamp_utc = now_utc.timestamp()
print(f"从 UTC datetime 对象生成的时间戳: {timestamp_utc}")
# 示例输出:
# 当前 datetime 对象: 2025-03-15 18:40:00.123456
# 类型: <class 'datetime.datetime'>
# 从 datetime 对象生成的时间戳: 1678886400.123456
# 从 UTC datetime 对象生成的时间戳: 1678886400.123456
注意:datetime.datetime.now() 返回的是本地时间的 datetime 对象,而 .timestamp() 方法会将其正确地转换为 UTC 时间戳。datetime.datetime.utcnow() 返回的是 UTC 时间的 datetime 对象,.timestamp() 的结果与前者相同。
将时间戳转换为 datetime 对象
这是 datetime 模块的一大优势,非常直观。
import datetime
timestamp = 1678886400
# 将时间戳转换为 datetime 对象
dt_object = datetime.datetime.fromtimestamp(timestamp)
print(f"从时间戳转换的 datetime 对象: {dt_object}")
print(f"类型: {type(dt_object)}")
# 示例输出:
# 从时间戳转换的 datetime 对象: 2025-03-15 10:40:00
# 类型: <class 'datetime.datetime'>
格式化 datetime 对象
datetime 对象有自己的 strftime() 方法,使用方法与 time 模块相同。
import datetime
timestamp = 1678886400
dt_object = datetime.datetime.fromtimestamp(timestamp)
# 格式化为字符串
formatted_time = dt_object.strftime("%Y-%m-%d %H:%M:%S")
print(f"格式化后的时间: {formatted_time}")
# 示例输出:
# 格式化后的时间: 2025-03-15 10:40:00
总结与对比
| 功能 | time 模块 |
datetime 模块 |
推荐场景 |
|---|---|---|---|
| 获取当前时间戳 | time.time() |
datetime.now().timestamp() |
time.time() 更直接,性能稍好。datetime 方法则更面向对象。 |
| 时间戳转时间 | time.localtime() |
datetime.fromtimestamp() |
datetime 的方法更直观,返回的是一个功能强大的对象,而不是元组。 |
| 时间转时间戳 | 无直接方法 | datetime_object.timestamp() |
datetime 模块提供了完整的双向转换。 |
| 格式化时间 | time.strftime() |
datetime_object.strftime() |
功能和使用方式相同。 |
- 如果只是简单地获取或使用时间戳,
time.time()是最快、最简单的方法。 - 如果需要进行复杂的日期时间计算、格式化、时区转换等操作,强烈推荐使用
datetime模块,因为它更强大、更易于理解,也更符合现代 Python 编程的风格。
对于大多数现代应用,datetime 模块是更好的选择。
