时间戳是从 1970-01-01 00:00:00 UTC 起算的秒数(或毫秒数)。它永远不带时区, 时区是转换时加上去的——所有「时间差 8 小时」「差一天」的问题都出在这里。
时间戳转换工具:双向转换,同时显示秒/毫秒/本地时间/UTC, 纯本地计算。
转换时间戳 →# Linux / Mac
date -d @1794290018
date -d @1794290018 +"%Y-%m-%d %H:%M:%S %Z"
# 毫秒要除以 1000
date -d @$((1794290018919/1000))
# Windows PowerShell
[DateTimeOffset]::FromUnixTimeSeconds(1794290018).ToLocalTime()
[DateTimeOffset]::FromUnixTimeMilliseconds(1794290018919).ToLocalTime()
# Python
from datetime import datetime, timezone
datetime.fromtimestamp(1794290018, tz=timezone.utc)
datetime.now(timezone.utc).timestamp()
# JavaScript(毫秒!)
new Date(1794290018919).toISOString()
Date.now()
datetime.fromtimestamp(t)(不带 tz)返回的是本机时区,
在服务器上跑和在本地跑差 8 小时。永远显式写 tz=timezone.utc。Europe/Berlin、America/New_York 一年两次时差变化,
用固定偏移 +02:00 写死会在换季那天错一小时。要日期加减就用带时区名的库。看 nginx 访问日志时,时间戳的时区决定了你判断「攻击发生在几点」是否正确。
日志里的 +0800 是本地时间,转成 UTC 再和服务器上的其他日志对齐,才不会得出错误结论。