1. 導入:なぜIntl.DateTimeFormatなのか
フロントエンド開発において、日付の表示は避けて通れないタスクです。`Date.toLocaleDateString()` を使うことも多いですが、大量のリストやテーブルをレンダリングする際、毎回インスタンスを生成するとパフォーマンスに悪影響を及ぼします。`Intl.DateTimeFormat` を活用することで、フォーマット処理を再利用可能なオブジェクトとして保持でき、パフォーマンス向上とロケール対応の柔軟性を両立することが可能になります。
2. 基礎知識:Intl.DateTimeFormatとは
`Intl.DateTimeFormat` は、ECMAScriptの国際化APIの一部です。標準的な `Date` オブジェクトを、指定した言語や地域の形式に合わせて文字列へ変換するためのクラスです。
最大の特徴は、コンストラクタで設定をキャッシュできる点です。一度インスタンスを作成すれば、`format` メソッドを呼び出すだけで変換ができるため、ループ処理内での不要なオブジェクト生成を抑えられます。
3. 実装/解決策:効率的な運用方法
実務では、アプリケーションの初期化時に必要なフォーマット設定をインスタンス化し、定数として保持します。これにより、レンダリングのたびに新しいインスタンスを生成するコストを回避します。
4. サンプルプログラム
以下は、日付の配列を効率的にフォーマットする実用的なコード例です。
// アプリケーション全体で使い回すフォーマッタを定義
// コンストラクタでオプションを指定することで、特定の形式に固定
const dateFormatter = new Intl.DateTimeFormat('ja-JP', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit'
});
const dates = [new Date('2023-10-01T10:00:00'), new Date('2023-10-02T15:30:00')];
// formatメソッドを使用して変換(インスタンスを再利用しているため高速)
const formattedDates = dates.map(date => dateFormatter.format(date));
console.log(formattedDates);
// 出力例: ["2023/10/01 10:00", "2023/10/02 15:30"]
5. 応用・注意点:現場で役立つTIPS
・タイムゾーンの指定:
`Intl.DateTimeFormat` は、デフォルトでは実行環境のタイムゾーンを使用します。サーバーから受け取ったUTC時間を特定のタイムゾーン(例: ‘Asia/Tokyo’)で表示したい場合は、コンストラクタのオプションに `timeZone: ‘Asia/Tokyo’` を必ず指定してください。
・パフォーマンスの罠:
ループ内で `new Intl.DateTimeFormat(…).format(date)` と記述すると、メリットであるキャッシュの恩恵を一切受けられません。必ずループの外でインスタンスを作成し、そのインスタンスを使い回すように設計してください。
・ブラウザ互換性:
主要なモダンブラウザでは標準サポートされていますが、極端に古い環境をサポートする必要がある場合は、Polyfill(@formatjs/intl-datetimeformatなど)の導入を検討してください。