Dune时间戳怎么转本地时间:区块时间与时区处理
Dune里的区块时间默认以UTC(协调世界时)存储,你看到的查询结果也是UTC时间。转换成你自己的本地时间,只需要在查询语句里用AT TIME ZONE或CONVERT_TZ指定你所在的时区(比如'Asia/Shanghai')。
1. 先确认Dune里时间字段的默认格式
Dune 的区块时间字段(如block_time、block_timestamp)存储为timestamp with time zone类型,默认是 UTC 时区。
你在查询结果里直接看到的,就是 UTC 时间。如果你所在的时区不是 UTC(比如北京时间是 UTC+8),那直接读出来的时间会"慢"8个小时。
前置条件:你已经在 Dune 的查询编辑器里写了一个 SQL 查询,并能看到block_time这类时间字段的返回结果。
2. 实操:在查询里转成你的本地时间
步骤1:确定你的目标时区
做什么:用你所在的城市或时区偏移量来指定时区。
怎么做:标准写法是
'地区/城市'格式,比如'Asia/Shanghai'(北京时间)、'America/New_York'(美国东部时间)。也可以用'UTC+08:00'这种偏移量写法,但城市写法能自动处理夏令时。做到什么程度算完成:你明确知道自己要转成哪个时区。
步骤2:在查询语句里用AT TIME ZONE转换
做什么:在
SELECT语句里,用AT TIME ZONE运算符把 UTC 时间转成目标时区。怎么做:
SELECT block_time AT TIME ZONE 'Asia/Shanghai' AS local_time FROM ...做到什么程度算完成:查询返回的
local_time字段显示的时间,比你直接看block_time多了 8 个小时(北京时间)。
常见失败原因:直接在WHERE条件里用转换后的时间做过滤,可能会因为时区转换导致索引失效或查询变慢。建议WHERE里还是用原始的 UTC 时间范围,只在SELECT展示时做转换。
风险提醒:Dune 的utils.hours、utils.days等时间辅助表,生成的时间序列也是 UTC 时区。如果你用这些表做时间轴(比如LEFT JOIN utils.hours),记得把block_time和utils.hours.timestamp都转成同一个时区再关联,否则会"对不上"。
做完以上步骤,怎么确认转换对了?
在你转换后的时间列上,用EXTRACT(HOUR FROM ...)取小时数,和你当前本地时间的小时数对比——如果一致,说明时区转换已生效。下一步,如果在仪表板里展示,可以把转换逻辑直接写在图表查询里,这样看板观众看到的就是他们当地的时间。
