ミリ秒を日付に変換
ミリ秒単位のUNIXタイムスタンプを日付として読み、1秒未満の値はISO 8601の行に残します。
1行に1つのタイムスタンプまたは日付を、最大500行まで入力できます。
このコードをDiscordのメッセージに貼り付けると、読む人それぞれのタイムゾーンと言語で表示されます。
このタイムスタンプを自分のコードで変換します。
エポックのミリ秒を日付に変換する
フロントエンド開発者が出会う時刻の値は、多くがミリ秒です。言語がそう渡してくるからで、Date.now()が数えるのは秒ではなくミリ秒です。その先にあるログ基盤からデータベースの列までが、単位について足並みをそろえる必要に迫られます。このページは単位メニューをミリ秒にした状態でタイムスタンプ変換ツールを開くので、13桁の数値を貼り付けた瞬間から正しく読まれます。
答えは4行同時に表示されます。上部で選択中のタイムゾーンでの瞬間、同じ瞬間の<abbr title="Coordinated Universal Time">UTC、多くのAPIが求めるISO 8601形式、そして現在からの隔たりを平易な言葉で示したものです。すべてページ内で計算されるので、本番ログから取った値も自分のマシンに留まります。
13桁、そして数えるだけでは足りないとき
自動判定は桁数から働き、今世紀の日付なら正しく当たります。ただし単位は、その数値を生んだシステムの性質であって、数値自体の性質ではありません。単位メニューを固定すれば推測はなくなります。間違えた代償は目立たないものではありません。単位が1段変わるごとに、日付は3桁分ずれるからです。
1735689600000に選んだ単位 | 生成される日付 | 判定 |
|---|---|---|
| 秒 | 56971年10月25日 | 1000倍だけ逆方向にずれている |
| ミリ秒 | 2025年1月1日 00:00:00 UTC | この数値が意味するもの |
| マイクロ秒 | 1970年1月21日 02:08:09 UTC | 1970年近くの日付が典型的な症状 |
| ナノ秒 | 1970年1月1日 00:28:55 UTC | ほぼエポックそのもの |
つまり1970年のはじめ数日の日付や、数万年先の日付は、壊れたデータであることはほとんどありません。同じ整数を誤った単位で読んだ結果であり、直すのは数値ではなくメニューです。
ミリ秒のタイムスタンプが生まれる場所
- JavaScript:
Date.now()とnew Date().getTime()はどちらもミリ秒を返し、new Date(n)もミリ秒を求めます。だから10桁の値は先に1000を掛ける必要があります。 - Java:
System.currentTimeMillis()とInstant.toEpochMilli()。 - MongoDB:BSONの日付型は、エポックからのミリ秒を符号付き64ビットで数えた値です。
- Kafka、Elasticsearch、そして多くのJSONログ形式。書き込む側の言語から単位を受け継いでいます。
データベースやUNIX系のツールは反対に秒で数えるため、JavaScriptのサービスとSQLの列の境目こそ、1000という係数が失われる場所です。疑わしい値をここで変換して日付を読むのが、どちら側が落としたのかを知る一番早い方法です。
丸めと、複数の値の変換
ミリ秒から秒への変換は切り捨てなので、1か所で、1つの向きに行ってください。あるサービスでは切り捨て、別のサービスでは四捨五入と混ざると、2つのイベントが同じ秒に入ったときにだけ現れる1秒差が生まれます。変換ツールの下の一括タブも同じ規則に従います。最大500行を貼り付けると、各行に端数を落とした秒の列と、端数を保ったISO 8601の列が並び、CSVでコピーできる状態になります。
関連する変換
10桁の値にはタイムスタンプを日付に変換があり、逆方向には、選んだ日付について秒とミリ秒の両方を返す日付をタイムスタンプに変換があります。現在のUNIXタイムスタンプはツールバーで動いているカウンターで、Discordのタイムスタンプは秒の形を必要とするため、下の単位へ変換したくなる代表的な理由になります。