世界最初のツイートは、ジャック・ドーシー(Jack Dorsey)による 2006-03-22 の https://twitter.com/jack/status/20 である。この「20」というツイートのIDは、当時はMySQLのユニークIDを使っていたようだが、2010-06-01 の Announcing Snowflake という記事で、Snowflake という仕組みに切り替えることがアナウンスされた。
現在の Twitter ID は、Snowflake という仕組みで、日時から生成される。下位22ビットはユニークなランダム値で,上位は 2010-11-04 01:42:54.657 UTC (2010-11-04 10:42:54.657 JST) を起点としたミリ秒単位の時刻を表す。したがって,IDからツイートのタイムスタンプを求めるには次のようにすればよい:
import datetime def id2time(id): return ((id >> 22) + 1288834974657) / 1000 id = 1177189139873054725 # このIDのツイートのタイムスタンプを求める print(f'{datetime.datetime.fromtimestamp(id2time(id)):%Y-%m-%d %H:%M:%S}')
2019-09-26 20:52:16 と出力される。あるいは次のようにしてもよい:
import numpy as np print(np.datetime64("2010-11-04 10:42:54.657") + np.timedelta64(id >> 22, "ms"))
2019-09-26T20:52:16.719 と出力される。
逆は次のようにすればよい。例えばタイムスタンプ 2019-09-26 20:52:16 のIDは
t = '2019-09-26 20:52:16' print((np.datetime64(t) - np.datetime64("2010-11-04 10:42:54.657")).astype(int) << 22)
小さめの値 1177189136855990272 が出力される。
ちなみに、Twitterは2022年5月時点で毎秒1万ツイートほどらしい(How Many Tweets per Day)。ミリ秒あたり10ツイート。22ビットあれば十分なのであろう。