时间戳的学习,参照案例学习,一目了然
python import time from datetime import datetime # ====== 获取时间戳 ====== # time.time() 返回浮点数秒数(如 1718242573.123456) # int() 转换为整数秒级时间戳 timestamp = int(time.time()) print(f"当前时间戳: {timestamp}") # 1718242573 # ====== 格式化输出 ====== # strftime() 将datetime对象格式化为字符串 # %Y:4位年份 %m:月份 %d:日期 %H:24小时 %M:分钟 %S:秒 dt = datetime.fromtimestamp(timestamp) log_time = dt.strftime("%Y-%m-%d %H:%M:%S") print(f"可读时间: {log_time}") # 2024-06-12 18:36:13 # ====== 日志示例 ====== log_message = f"[{log_time}] [INFO] 用户登录成功, 用户ID: 1001" print(log_message) # [2024-06-12 18:36:13] [INFO] 用户登录成功, 用户ID: 1001技术细节:
time.time()返回UTC时间戳(从1970年1月1日UTC零点开始)datetime.fromtimestamp()默认转成本地时区时间- 日志中常用UTC时间戳避免时区混乱
场景2:数据库存储
python import time from datetime import datetime, timezone # ====== 存储为时间戳 ====== # 用时间戳存储,数据库可以按数值排序(时间先后) user_action = { "user_id": 1001, "action": "login", "timestamp": int(time.time()) # 存储为整数 } print(f"存储数据: {user_action}") # ====== 查询时转换 ====== # 从时间戳还原为可读时间 retrieved_time = user_action["timestamp"] dt_utc = datetime.fromtimestamp(retrieved_time, tz=timezone.utc) dt_local = datetime.fromtimestamp(retrieved_time) # 本地时区 print(f"UTC时间: {dt_utc.strftime('%Y-%m-%d %H:%M:%S')}") print(f"本地时间: {dt_local.strftime('%Y-%m-%d %H:%M:%S')}")技术细节:
- 时间戳是整数,占用空间小,查询快
- 排序时直接按数值比较(大数=时间晚)
- UTC时间戳不依赖时区,避免数据歧义
场景3:API交互(JSON数据)
python import time import json from datetime import datetime # ====== 发送数据 ====== # JSON序列化时,datetime对象不能直接转换 # 需要转成ISO格式或时间戳 api_data = { "event": "button_click", "timestamp": datetime.utcnow().isoformat() + "Z" # ISO 8601格式 } print(f"发送数据: {json.dumps(api_data)}") # ====== 接收数据 ====== # 接收时解析ISO格式 received = {"event": "login", "timestamp": "2024-06-12T10:36:13Z"} # 解析ISO格式 dt_received = datetime.fromisoformat(received["timestamp"].replace("Z", "+00:00")) print(f"解析时间: {dt_received}")技术细节:
- ISO 8601格式是国际标准,人类和机器都可读
- "Z"表示UTC时间(Zulu time)
- JSON不支持datetime对象,必须转字符串
练手代码(试试看)
python # 练习1:生成10秒内的时间戳列表 import time timestamps = [] for i in range(10): timestamps.append(int(time.time())) time.sleep(1) # 等待1秒 print("10秒内的时间戳:", timestamps) # 练习2:计算两个时间戳的差值 t1 = int(time.time()) time.sleep(2) # 模拟等待2秒 t2 = int(time.time()) difference = t2 - t1 print(f"时间差: {difference}秒") # 练习3:格式化当前时间为多种格式 dt = datetime.now() formats = { "标准格式": dt.strftime("%Y-%m-%d %H:%M:%S"), "中文格式": dt.strftime("%Y年%m月%d日 %H时%M分%S秒"), "文件名": dt.strftime("%Y%m%d_%H%M%S") } for name, value in formats.items(): print(f"{name}: {value}")运行预期:
- 练习1:生成10个递增的时间戳
- 练习2:输出"2秒"左右
- 练习3:显示三种不同格式的当前时间
建议学习路径:
- 先运行上述代码观察输出
- 修改时间格式字符串,观察变化
- 尝试将时间戳转回可读时间
- 思考:为什么日志系统用时间戳而不是字符串?
