HB DevTools

Technical Docs

Unix Timestamp Converter の設計

Unix時間の概念と10桁/13桁の自動判別ロジック、Intl API を活用したローカル/UTC同時表示の設計を解説します。

1. 設計思想 — なぜこのツールが必要か

Unix タイムスタンプ(Unix time / POSIX time)は、 1970年1月1日 00:00:00 UTC からの経過秒数(またはミリ秒数)で表現された数値です。 バックエンドのログ、データベースのレコード、JWT のペイロード(iatexp)など、 エンジニアが日常的に目にする形式です。

1706745600 というタイムスタンプが何年何月何日を表すか、 人間は即座に判断できません。また、JavaScriptでは Date.now() が ミリ秒(13桁)を返す一方、多くのバックエンド言語は秒(10桁)を返すため、桁数の違いによる混乱も頻繁に発生します。 本ツールはこれらの問題をワンストップで解決します。

2. 技術アーキテクチャ

3つの純粋関数で構成されています。

  • convertFromTimestamp(input): 数値文字列(10〜13桁)を受け取り、 対応する日時(ローカル・UTC)を返します。
  • convertFromDate(input): ISO 8601 や yyyy/MM/dd HH:mm:ss 形式の 文字列を受け取り、対応するUnixタイムスタンプ(秒・ミリ秒)を返します。
  • getNow(): 現在時刻のタイムスタンプと日時を返します。 「現在時刻を取得」ボタンから呼び出されます。

いずれも UnixConvertOutput(Success | Error の Union型)を返し、 例外を外部に漏らしません。 Layer 2(Client Component)は変換モード(タイムスタンプ→日時 or 日時→タイムスタンプ)をuseState で管理し、適切な関数を呼び出します。

3. ロジック解説

10桁/13桁の自動判別は文字列の長さで行います。trimmed.length <= 10 であれば秒(× 1000 でミリ秒に変換)、11〜13 であればミリ秒としてそのまま扱います。 14桁以上はエラーとします。 この判別は「2001年以降の秒タイムスタンプは必ず10桁」という性質を利用しています。

日時の表示には Intl.DateTimeFormat を使用します。 ローカル時間は timeZone を省略(ブラウザのタイムゾーンを使用)、 UTC表示は timeZone: 'UTC' を明示的に指定します。toLocaleString('ja-JP', options) で日本語形式(2026/02/01 12:00:00)に統一しています。

日時→タイムスタンプ変換では、yyyy/MM/dd 形式はDate.parse() が解釈できないため、/- に 置換してから渡します(ISO 8601 の yyyy-MM-dd 形式への正規化)。

4. 品質管理

src/lib/tools/__tests__/unix-converter.test.ts に Vitest による単体テストを実装しています。

  • 桁数判別テスト: 10桁(秒)・13桁(ミリ秒)それぞれを入力して 同一の日時に変換されることを確認。
  • 日時変換テスト: 既知の日時(例: 2024-01-01 00:00:00 UTC)の タイムスタンプが正しい値になることを確認。
  • エラーハンドリング: 14桁以上・数字以外・空文字列の 各ケースで適切なエラーが返ることを確認。
  • エポックテスト: Unix 時間の起点(0)が 1970/01/01 00:00:00 UTC と正しく対応することを確認。