Dune时间戳怎么转本地时间:区块时间与时区处理

 / 
2

Dune里的区块时间默认以UTC(协调世界时)存储,你看到的查询结果也是UTC时间。转换成你自己的本地时间,只需要在查询语句里用AT TIME ZONECONVERT_TZ指定你所在的时区(比如'Asia/Shanghai')。

欧易OKX交易所
全球领先的加密货币平台,适合新手与进阶交易者
新手福利:注册即享20% 交易手续费减免!

1. 先确认Dune里时间字段的默认格式

Dune 的区块时间字段(如block_timeblock_timestamp)存储为timestamp with time zone类型,默认是 UTC 时区。

你在查询结果里直接看到的,就是 UTC 时间。如果你所在的时区不是 UTC(比如北京时间是 UTC+8),那直接读出来的时间会"慢"8个小时。

前置条件:你已经在 Dune 的查询编辑器里写了一个 SQL 查询,并能看到block_time这类时间字段的返回结果。

欧易OKX交易所
全球领先的加密货币平台,适合新手与进阶交易者
新手福利:注册即享20% 交易手续费减免!

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.hoursutils.days等时间辅助表,生成的时间序列也是 UTC 时区。如果你用这些表做时间轴(比如LEFT JOIN utils.hours),记得把block_timeutils.hours.timestamp都转成同一个时区再关联,否则会"对不上"。

做完以上步骤,怎么确认转换对了?

在你转换后的时间列上,用EXTRACT(HOUR FROM ...)取小时数,和你当前本地时间的小时数对比——如果一致,说明时区转换已生效。下一步,如果在仪表板里展示,可以把转换逻辑直接写在图表查询里,这样看板观众看到的就是他们当地的时间。