<NuxtTime>
<NuxtTime> コンポーネントは、ロケールに適した形式で時間を表示し、サーバーとクライアントの一貫性を保ちます。
このコンポーネントは Nuxt v3.17+ で利用可能です。
<NuxtTime> コンポーネントを使用すると、適切な <time> HTML セマンティクスを使用して、ロケールに適した形式で日付と時間を表示できます。サーバーとクライアント間でのレンダリングの一貫性を保ち、ハイドレーションの不一致を防ぎます。
使用法
<NuxtTime> コンポーネントはアプリのどこでも使用できます:
<template>
<NuxtTime :datetime="Date.now()" />
</template>
Props
datetime
- タイプ:
Date | number | string - 必須:
true
表示する日付と時間の値です。以下を指定できます:
Dateオブジェクト- タイムスタンプ(数値)
- ISO形式の日付文字列
<template>
<NuxtTime :datetime="Date.now()" />
<NuxtTime :datetime="new Date()" />
<NuxtTime datetime="2023-06-15T09:30:00.000Z" />
</template>
locale
- タイプ:
string - 必須:
false - デフォルト: ブラウザまたはサーバーのデフォルトロケールを使用
フォーマット用の BCP 47 言語タグ(例: 'en-US', 'fr-FR', 'ja-JP'):
<template>
<NuxtTime :datetime="Date.now()" locale="fr-FR" />
</template>
フォーマット用の Props
このコンポーネントは Intl.DateTimeFormat オプションからの任意のプロパティを受け入れます:
<template>
<NuxtTime
:datetime="Date.now()"
year="numeric"
month="long"
day="numeric"
hour="2-digit"
minute="2-digit"
/>
</template>
これは次のように出力されます: "April 22, 2025, 08:30 AM"
relative
- タイプ:
boolean - 必須:
false - デフォルト:
false
Intl.RelativeTimeFormat API を使用して相対時間のフォーマットを有効にします:
<template>
<!-- "5 minutes ago" のように表示 -->
<NuxtTime :datetime="Date.now() - 5 * 60 * 1000" relative />
</template>
相対時間フォーマット用の Props
relative が true に設定されている場合、コンポーネントは Intl.RelativeTimeFormat からのプロパティも受け入れます:
<template>
<NuxtTime
:datetime="Date.now() - 3 * 24 * 60 * 60 * 1000"
relative
numeric="auto"
style="long"
/>
</template>
これは次のように出力されます: "3 days ago" または numeric 設定に応じて "last Friday"
例
基本的な使用法
<template>
<NuxtTime :datetime="Date.now()" />
</template>
カスタムフォーマット
<template>
<NuxtTime
:datetime="Date.now()"
weekday="long"
year="numeric"
month="short"
day="numeric"
hour="numeric"
minute="numeric"
second="numeric"
timeZoneName="short"
/>
</template>
相対時間
<template>
<div>
<p>
<NuxtTime :datetime="Date.now() - 30 * 1000" relative />
<!-- 30 seconds ago -->
</p>
<p>
<NuxtTime :datetime="Date.now() - 45 * 60 * 1000" relative />
<!-- 45 minutes ago -->
</p>
<p>
<NuxtTime :datetime="Date.now() + 2 * 24 * 60 * 60 * 1000" relative />
<!-- in 2 days -->
</p>
</div>
</template>
カスタムロケールで
<template>
<div>
<NuxtTime :datetime="Date.now()" locale="en-US" weekday="long" />
<NuxtTime :datetime="Date.now()" locale="fr-FR" weekday="long" />
<NuxtTime :datetime="Date.now()" locale="ja-JP" weekday="long" />
</div>
</template>
tips
このセクションは公式ドキュメントの翻訳ではなく、本サイト独自の補足記事です。
NuxtTime コンポーネントの補足解説
NuxtTime コンポーネントは、Nuxt 3.17 以降で利用可能な日時表示用の便利なコンポーネントです。日時をロケールに合わせて適切にフォーマットし、サーバーサイドレンダリング(SSR)とクライアントサイドレンダリング(CSR)間での表示のズレ(ハイドレーション不一致)を防ぐことができます。
この補足記事では、NuxtTime のメリットや使いどころ、実務での具体的なユースケース、注意すべきポイントを丁寧に解説します。初級から中級の Nuxt ユーザーが、より効果的に日時表示を扱えるようになることを目指しています。
1. NuxtTime を使うメリットと解決できる課題
-
ロケールに応じた日時表示が簡単にできる
Intl API を活用し、ユーザーの言語や地域に合わせた自然な日時フォーマットを実現。 -
SSR と CSR の表示差異を防止
サーバーとクライアントで異なる日時フォーマットが出る問題を解消し、ハイドレーションエラーを回避。 -
相対時間表示もサポート
「5分前」「2日前」などの相対的な時間表現を Intl.RelativeTimeFormat を使って簡単に実装可能。 -
柔軟なカスタマイズが可能
Intl.DateTimeFormat のオプションをそのまま渡せるため、細かい表示調整も容易。
2. まず結論:NuxtTime の要点まとめ
datetimeプロパティに Date オブジェクト、タイムスタンプ、ISO 文字列を指定して日時を渡す。localeで表示言語・地域を指定可能。指定しなければ環境のデフォルトロケールを使用。- Intl.DateTimeFormat のオプション(year, month, day, hour, minute など)を自由に指定できる。
relativeを true にすると相対時間表示に切り替わり、Intl.RelativeTimeFormat のオプションも利用可能。- SSR と CSR の表示差異を防ぐため、NuxtTime は内部で適切にレンダリングを制御している。
3. いつ使うべきか?使わない方がよいケース
使うべきケース
-
多言語対応が必要な日時表示を行う場合
例:国際化対応サイトでユーザーの言語に合わせて日時を表示したい。 -
SSR と CSR で日時表示のズレを防ぎたい場合
例:サーバー時間とクライアント時間の差異によるハイドレーションエラーを避けたい。 -
相対時間(例:「3時間前」)を表示したい場合
例:SNSの投稿日時やニュースの更新時間表示。 -
日時フォーマットを細かくカスタマイズしたい場合
例:曜日やタイムゾーン名を含めた表示。
使わない方がよいケース
-
単純に固定フォーマットの日時を表示し、ロケール対応や相対時間が不要な場合
→ 単純なフォーマット関数やライブラリで十分なことも。 -
クライアントのみで日時を扱い、SSR の影響を考慮しなくてよい場合
→ ただし将来的な拡張を考えると NuxtTime の利用は推奨。
4. 実務でよくあるユースケースとサンプルコード
ユースケース1:ユーザーの言語に合わせた日時表示
<template>
<div>
<p>日本語表示: <NuxtTime :datetime="new Date()" locale="ja-JP" year="numeric" month="long" day="numeric" /></p>
<p>英語表示: <NuxtTime :datetime="new Date()" locale="en-US" year="numeric" month="short" day="numeric" /></p>
</div>
</template>
ユースケース2:相対時間で「〇分前」「〇日前」を表示
<template>
<div>
<p>投稿: <NuxtTime :datetime="Date.now() - 5 * 60 * 1000" relative numeric="auto" style="long" /></p>
<p>更新: <NuxtTime :datetime="Date.now() - 2 * 24 * 60 * 60 * 1000" relative numeric="auto" style="short" /></p>
</div>
</template>
ユースケース3:詳細な日時フォーマット(曜日・時間帯含む)
<template>
<NuxtTime
:datetime="new Date()"
weekday="long"
year="numeric"
month="short"
day="numeric"
hour="2-digit"
minute="2-digit"
timeZoneName="short"
/>
</template>
5. よくある落とし穴・注意点
SSR と CSR のハイドレーション不一致
日時のフォーマットは環境(サーバーとクライアント)によって異なる場合があります。NuxtTime はこれを内部で調整しますが、以下の点に注意してください。
-
localeを明示的に指定しないと、サーバーとクライアントで異なるロケールが使われる可能性があるため、表示がズレることがあります。
→ 可能な限りlocaleを固定するか、ユーザーの言語設定を統一的に管理しましょう。 -
タイムゾーンの違いにも注意。サーバーとクライアントのタイムゾーンが異なると、日時の表示がずれることがあります。
→ 必要に応じてtimeZoneオプションを指定して明示的に制御しましょう。
パフォーマンス面
- Intl API はブラウザ組み込みのため高速ですが、相対時間の頻繁な更新(例:秒単位のカウントダウン)には向きません。
→ そうしたケースは専用のロジックやライブラリを検討してください。
入力値の型に注意
datetimeには Date オブジェクト、数値(タイムスタンプ)、ISO 文字列が使えますが、不正な値を渡すと表示が崩れたりエラーになることがあります。
→ 入力値の検証や変換を事前に行うことを推奨します。
6. まとめ
NuxtTime コンポーネントは、日時表示の多言語対応と SSR/CSR 間の一貫性を簡単に実現できる強力なツールです。実務ではユーザーのロケールに合わせた表示や相対時間表示、詳細なフォーマット指定などに活用できます。使う際はロケールやタイムゾーンの指定を意識し、ハイドレーション不一致を防ぐことが重要です。NuxtTime を適切に活用して、ユーザーにとって見やすく信頼性の高い日時表示を実装しましょう。
NuxtTime は内部で Intl API を利用しているため、ブラウザの対応状況に依存します。古いブラウザでの互換性が気になる場合は、ポリフィルの導入を検討してください。
※このページは Nuxt.js 公式ドキュメントの翻訳ページです。
公式ドキュメントの該当ページはこちら:
https://nuxt.com/docs/3.x/api/components/nuxt-time