Python时间戳转换完整教程
掌握Python中time、datetime模块处理Unix时间戳的所有技巧,包含获取、转换、格式化和时区处理的详细代码示例。
获取当前时间戳
使用time模块获取当前Unix时间戳
Python
import time
# 获取当前时间戳(秒级)
timestamp = int(time.time())
print(timestamp) # 输出: 1735660800
# 获取当前时间戳(毫秒级)
timestamp_ms = int(time.time() * 1000)
print(timestamp_ms) # 输出: 1735660800000
# 获取当前时间戳(微秒级)
timestamp_us = int(time.time() * 1000000)
print(timestamp_us) # 输出: 1735660800000000时间戳转日期时间
将Unix时间戳转换为可读的日期时间格式
Python
from datetime import datetime
# 时间戳转本地时间
timestamp = 1735660800
date = datetime.fromtimestamp(timestamp)
print(date.strftime('%Y-%m-%d %H:%M:%S')) # 2025-01-01 00:00:00
# 时间戳转UTC时间
date_utc = datetime.utcfromtimestamp(timestamp)
print(date_utc.strftime('%Y-%m-%d %H:%M:%S')) # 2024-12-31 16:00:00
# 毫秒时间戳转换
timestamp_ms = 1735660800000
date_ms = datetime.fromtimestamp(timestamp_ms / 1000)
print(date_ms.strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]) # 2025-01-01 00:00:00.000日期时间转时间戳
将日期时间对象或字符串转换为Unix时间戳
Python
from datetime import datetime
# 日期对象转时间戳
date = datetime(2025, 1, 1, 0, 0, 0)
timestamp = int(date.timestamp())
print(timestamp) # 1735660800
# 日期字符串转时间戳
date_str = '2025-01-01 00:00:00'
date_obj = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S')
timestamp = int(date_obj.timestamp())
print(timestamp) # 1735660800
# ISO格式字符串转时间戳
iso_str = '2025-01-01T00:00:00+08:00'
date_obj = datetime.fromisoformat(iso_str)
timestamp = int(date_obj.timestamp())
print(timestamp) # 1735660800时间格式化输出
将日期时间格式化为各种显示格式
Python
from datetime import datetime
date = datetime.fromtimestamp(1735660800)
# 常用格式
print(date.strftime('%Y-%m-%d')) # 2025-01-01
print(date.strftime('%Y/%m/%d %H:%M')) # 2025/01/01 00:00
print(date.strftime('%Y年%m月%d日')) # 2025年01月01日
print(date.strftime('%A, %B %d, %Y')) # Wednesday, January 01, 2025
# 自定义格式
formats = {
'完整日期时间': '%Y-%m-%d %H:%M:%S',
'仅日期': '%Y-%m-%d',
'仅时间': '%H:%M:%S',
'年月': '%Y-%m',
'中文日期': '%Y年%m月%d日 %H时%M分%S秒',
}
for name, fmt in formats.items():
print(f"{name}: {date.strftime(fmt)}")时区处理
处理不同时区的时间戳转换
Python
from datetime import datetime, timezone, timedelta
# 创建指定时区的时间
tz_shanghai = timezone(timedelta(hours=8))
tz_utc = timezone.utc
# 获取当前时间(带时区)
now_shanghai = datetime.now(tz_shanghai)
now_utc = datetime.now(tz_utc)
# 时间戳(无论哪个时区,时间戳都是相同的)
print(int(now_shanghai.timestamp())) # 相同
print(int(now_utc.timestamp())) # 相同
# 从时间戳创建指定时区的时间
timestamp = 1735660800
date_utc = datetime.fromtimestamp(timestamp, tz=timezone.utc)
date_shanghai = datetime.fromtimestamp(timestamp, tz=tz_shanghai)
print(date_utc.strftime('%Y-%m-%d %H:%M:%S %Z')) # 2024-12-31 16:00:00 UTC
print(date_shanghai.strftime('%Y-%m-%d %H:%M:%S %Z')) # 2025-01-01 00:00:00 UTC+08:00Pandas时间戳处理
在数据分析中使用Pandas处理时间戳
Python
import pandas as pd
# 从时间戳创建DatetimeIndex
timestamps = [1735660800, 1735747200, 1735833600]
dates = pd.to_datetime(timestamps, unit='s')
print(dates)
# DatetimeIndex(['2025-01-01', '2025-01-02', '2025-01-03'], dtype='datetime64[ns]', freq=None)
# 日期转时间戳
date_str = '2025-01-01'
timestamp = pd.Timestamp(date_str).timestamp()
print(int(timestamp)) # 1735660800
# 批量转换时间戳列
df = pd.DataFrame({
'timestamp': [1735660800, 1735747200, 1735833600],
'value': [100, 200, 300]
})
df['datetime'] = pd.to_datetime(df['timestamp'], unit='s')
print(df)最佳实践
- •存储时间时始终使用UTC时间戳,避免时区问题
- •显示时间时根据用户时区转换为本地时间
- •使用int()确保时间戳为整数,避免浮点精度问题
- •Python 3.11+推荐使用datetime.fromisoformat()解析ISO格式
常见问题
Python中time.time()和datetime.now()有什么区别?
time.time()返回Unix时间戳(浮点数),datetime.now()返回datetime对象。time.time()更轻量,适合计算时间差;datetime.now()功能更丰富,支持格式化和时区操作。
如何处理13位毫秒时间戳?
毫秒时间戳需要除以1000转换为秒级再使用:datetime.fromtimestamp(timestamp_ms / 1000)。生成毫秒时间戳:int(time.time() * 1000)。
Python时间戳有范围限制吗?
32位系统上时间戳范围是1901-2038年(2038年问题)。64位系统范围更大。建议使用datetime模块处理超出范围的时间。
fromtimestamp和utcfromtimestamp的区别?
fromtimestamp(timestamp)将时间戳转为本地时间,utcfromtimestamp(timestamp)转为UTC时间。建议使用datetime.fromtimestamp(timestamp, tz=timezone.utc)替代已弃用的utcfromtimestamp。