如何通过 ID 查出推文的发布时间

1

找到 ID

就是任意帖子链接末尾那串长数字:x.com/user/status/1234567890123456789。也可以直接粘贴整个链接。

2

粘贴一个或多个

最多 100 个 ID 或链接,每行一个。

3

查看时间

你会得到精确到毫秒的创建时间,按 UTC 和你所在的时区显示。需要的话可以把列表下载为 CSV。

已删除的帖子也能用。时间就存在 ID 本身里,所以帖子不需要还存在。

推特 Snowflake ID 是如何存储日期的

从 2010 年 11 月 4 日起,X 用一套名为 Snowflake 的系统生成帖子 ID。每个 ID 是一个 64 位数字,由三部分组成:

  • 帖子的创建时间,即从 X 自定义纪元开始的毫秒数;
  • 生成它的服务器 ID;
  • 序列号,用于区分同一毫秒内创建的帖子。

因为时间存在最高位,所以把 ID 右移 22 位再加上纪元,就能把时间取回来:

milliseconds since 1970 = (ID >> 22) + 1288834974657

  1. ID1234567890123456789
  2. 右移 22 位294343922167
  3. 加上纪元 1,288,834,974,6571583178896824
  4. =2020 年 3 月 2 日 19:54:56.824 UTC

例如,ID 1234567890123456789 右移 22 位得到 294,343,922,167。加上 1,288,834,974,657,得到 1,583,178,896,824 毫秒,也就是 2020 年 3 月 2 日 19:54:56.824 UTC。

近几年注册的 X 账号,其 ID 也使用同样的格式。要查一个账号的注册日期,账号注册时间查询可以直接读出来。

把日期转换成推文 ID 用于搜索

反过来也行。把毫秒数移回高位,就能得到那个时刻可能的最小 ID:

ID = (milliseconds since 1970 − 1288834974657) << 22

X 搜索支持 since_id: 和 max_id: 语法,大多数 API 也支持。用两个边界 ID,就能把搜索精确限定到某个时间窗口,精确到秒。这比按整天计算的 since: 和 until: 更精确。完整的查询可以用高级搜索生成器拼出来。

批量把推文 ID 转换成日期

一次粘贴最多 100 个 ID 或链接,可以来自表格、数据集或收藏的帖子列表。表格按日期排序,标出无效的行,并可下载为包含 ID、UTC 时间、ISO 时间和 Unix 毫秒的 CSV。研究人员用它给链接合集标注日期,记者用它整理时间线,开发者用它核对数据集。

相关工具

常见问题

怎么知道一条推文是什么时候发的?

在上方粘贴帖子的链接或 ID。转换工具会读取 ID 里存的创建时间,按 UTC、你所在的时区和 Unix 时间显示,精确到毫秒。

转换工具会去抓取推文吗?

不会。日期是在你的浏览器里根据 ID 算出来的,不向 X 发送任何请求,所以已删除的帖子也能用,离线也能用。想看帖子本身,可以用推文查看器打开。

能查到已删除推文的日期吗?

能。时间是 ID 的一部分,所以无论帖子还在不在,任何帖子 ID 都能算出日期。

什么是推特 Snowflake ID?

它是 X 从 2010 年 11 月 4 日起给帖子使用的 64 位 ID 格式。前 41 位以毫秒存储创建时间,后面是机器 ID 和序列号。所以 ID 会随时间增大,也能解码成日期。

为什么很老的推文用不了?

2010 年 11 月 4 日之前的帖子用的是不含时间戳的顺序 ID,所以无法从 ID 算出日期。

由日期反推出来的 ID 是真实的推文吗?

不是。由日期生成的 ID 是一个边界,也就是那个时刻可能的最小 ID,用于在搜索中配合 since_id 和 max_id 使用。它几乎不可能对应一条真实的帖子。

日期有多准确?

精确到毫秒。它就是帖子发布时 X 写进 ID 里的创建时间。

能一次转换很多推文 ID 吗?

能。每行粘贴一个 ID 或链接,最多 100 个,然后把结果下载为 CSV。

能把用户 ID 转换成日期吗?

较新的 X 用户 ID 使用同样的 Snowflake 格式,所以转换工具可以算出日期。较老、较短的用户 ID 无法解码。要查任意账号的准确注册日期,请用账号注册时间查询。