brand logo

ドキュメント

<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

relativetrue に設定されている場合、コンポーネントは 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 を利用しているため、ブラウザの対応状況に依存します。古いブラウザでの互換性が気になる場合は、ポリフィルの導入を検討してください。