DevToolKits.app
開発秘話

ライブラリ不要のタイムゾーン変換:Intl APIの底力

Moment.jsやdate-fnsを使わずに、ブラウザ標準のIntl APIだけで実現する軽量なタイムゾーン処理の裏側。

タイムゾーン変換ツールのイメージ

開発のきっかけ:Date型のカオスに立ち向かう

「UTCからJSTに直したい」「サーバーログの時刻がどの国の時間か分からない」。
エンジニアなら誰もが一度は「日付とタイムゾーン」という泥沼に足を取られた経験があるはずです。特にJavaScriptの Date オブジェクトは、直感的と言い難い挙動が多く、長らく開発者の天敵の一つでした。

これまでは Moment.js や date-fns、Day.js といった外部ライブラリを導入して解決するのが一般的でした。しかし、DevToolKits を開発するにあたって、私は自分自身に一つの制約を課しました。**「たった一箇所の時刻変換のために、数十KBものライブラリをダウンロードさせる必要があるのか?」**という問いです。

「現代のブラウザ標準機能だけで、最高に軽快なタイムゾーン変換は作れるはずだ」。この個人的な「挑戦状」から、タイムゾーン変換ツール の開発は始まりました。

技術的な工夫:標準APIを極限まで使い倒す

私たちが注目したのは、ブラウザに標準搭載されている Intl(Internationalization API)です。

1. Intl.DateTimeFormat による「正確な分解」

特定タイムゾーンの日時を ISO 8601 形式で出力するのは、標準 API だけだと意外と骨が折れます。そこで、formatToParts を使って日時をパーツ単位で解体し、再構築する手法を採用しました。

const formatter = new Intl.DateTimeFormat('en-CA', {
  timeZone,
  hour12: false,
  year: 'numeric',
  month: '2-digit',
  day: '2-digit',
  hour: '2-digit',
  minute: '2-digit',
  second: '2-digit',
});

// 年、月、日などのパーツを個別に抜き出す
const parts = formatter.formatToParts(date).reduce((acc, cur) => ({
  ...acc, [cur.type]: cur.value
}), {} as any);

この「一度バラバラにしてから、望む形に組み立て直す」というアプローチにより、重いライブラリを一切使わずに、完璧なフォーマット処理を実現しました。

2. 動的なオフセット抽出のハック

タイムゾーン変換で最も厄介なのは、「JSTは+09:00」というようなオフセット情報です。これを自前で辞書として持つと、サマータイムなどの変更に対応できません。

そこで、timeZoneName: 'shortOffset' オプションからブラウザが持つ最新のオフセット情報を抽出し、それをパースして結合するロジックを組み込みました。

// ブラウザが持っている「その瞬間」の時差情報を取得
const offsetName = new Intl.DateTimeFormat('en-US', {
  timeZone,
  timeZoneName: 'shortOffset',
}).formatToParts(date).find(p => p.type === 'timeZoneName')?.value;

これにより、「常にOSやブラウザが持つ最新のタイムゾーンデータを利用できる」という、自前実装ならではの強みを手に入れました。

「何もしない」がもたらす最高の速度

このツールは、ページを開いた瞬間に利用可能です。
重いスクリプトのパース待ちも、APIへのリクエストもありません。
ブラウザが元々持っている能力を最大限に引き出すことで、**「ライブラリ不要」かつ「依存関係ゼロ」**という、エンジニアが理想とする究極の軽量ツールが完成しました。

まとめ

タイムゾーン変換ツールは、私にとって「ブラウザ標準機能の可能性」を再確認させてくれる開発でした。
「ライブラリを足す前に、まず標準を疑う」。そんな開発者の矜持が、このツールの軽快な動作に繋がっています。

世界中の時間を、もっと身近に、もっと軽やかに。ぜひ一度、そのスピードを体験してみてください。

関連ツール

広告

広告