Formatierung relativer Zeitangaben

Anzeige von "vor 2 Tagen" anstelle eines Zeitstempels

Problem

Eine Anwendung zeigt einen Zeitstempel wie "Vor 2 Tagen gepostet" an. Während dies im Englischen klar ist, unterscheiden sich die Logik und Grammatik für "vor 2 Tagen" gegenüber "in 2 Tagen" (Vergangenheit vs. Zukunft) erheblich zwischen den Sprachen. Eine einfache String-Verkettung (z. B. "2" + " " + "Tage her") führt nicht zu grammatikalisch korrekter Ausgabe.

Lösung

Verwenden Sie eine dedizierte Komponente wie FormattedRelativeTime aus react-intl. Diese Komponente nimmt einen numerischen Wert (z. B. -2) und eine Einheit (z. B. "day") entgegen und formatiert diese automatisch in einen sprachbewussten, grammatikalisch korrekten String wie "vor 2 Tagen", "hace 2 días" oder "gestern".

Schritte

1. Erstellen Sie eine Client-Komponente für relative Zeitangaben

Die FormattedRelativeTime-Komponente muss innerhalb einer Client-Komponente verwendet werden.

Erstellen Sie eine neue Datei app/components/RelativeTime.tsx.

// app/components/RelativeTime.tsx
'use client';

import { FormattedRelativeTime } from 'react-intl';

type Props = {
  value: number;
  unit: Intl.RelativeTimeFormatUnit;
};

export default function RelativeTime({ value, unit }: Props) {
  return (
    <FormattedRelativeTime
      value={value}
      unit={unit}
      numeric="auto" // "auto" allows "yesterday" or "tomorrow"
      style="long"
    />
  );
}

2. Übergeben Sie Formatierungsoptionen

Die FormattedRelativeTime-Komponente akzeptiert mehrere wichtige Props:

  • value: Die Anzahl der Einheiten. Ein negativer Wert (z. B. -2) zeigt die Vergangenheit an ("vor 2 Tagen"), und ein positiver Wert (2) zeigt die Zukunft an ("in 2 Tagen").
  • unit: Die Zeiteinheit, wie "day", "hour", "minute" oder "second".
  • numeric="auto": Dies ermöglicht es der Bibliothek, Wörter wie "gestern" oder "morgen" anstelle von "vor 1 Tag" oder "in 1 Tag" zu verwenden.

3. Verwenden Sie die Komponente auf einer Seite

Sie können diese Komponente nun auf jeder Seite verwenden. Sie sind dafür verantwortlich, die Zeitdifferenz zu berechnen, bevor Sie die Props übergeben.

// app/[lang]/page.tsx
import RelativeTime from '@/app/components/RelativeTime';

export default function Home() {
  // You would calculate these values dynamically
  const daysSinceUpdate = -2;
  const hoursUntilEvent = 3;

  return (
    <div>
      <h1>Updates</h1>
      <p>
        File updated: <RelativeTime value={daysSinceUpdate} unit="day" />
      </p>
      <p>
        Event starts: <RelativeTime value={hoursUntilEvent} unit="hour" />
      </p>
    </div>
  );
}

Ein Benutzer, der /en besucht, sieht „File updated: 2 days ago" und „Event starts: in 3 hours". Ein Benutzer, der /es besucht, sieht „File updated: hace 2 días" und „Event starts: dentro de 3 horas".