Datum und Uhrzeit korrekt mit Claude Code handhaben
Erfahren Sie, wie Sie Datum und Uhrzeit korrekt mit Claude Code handhaben. Mit praktischen Codebeispielen.
Datums- und Zeitverarbeitung mit Claude Code korrekt implementieren
Die Verarbeitung von Datum und Uhrzeit birgt viele unerwartete Fallstricke: Zeitzonen, Formatierung, Locale-Unterstützung und mehr. Mit Claude Code können Sie robuste Datumsverarbeitung gemäß Best Practices effizient implementieren.
Bibliotheksauswahl
> Erstelle Utilities für Datums- und Zeitverarbeitung.
> Verwende day.js mit Zeitzonenkonvertierung, relativer Zeitanzeige,
> deutschem Format und Arbeitstageberechnung.
- day.js: Leichtgewichtig (2KB) mit Moment.js-kompatibler API
- date-fns: Funktionsbasiert, optimal für Tree-Shaking
- Temporal API: Zukünftige Standard-API (noch im Vorschlagsstadium)
Implementierung der Datums-Utilities
// src/lib/date-utils.ts
import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';
import relativeTime from 'dayjs/plugin/relativeTime';
import 'dayjs/locale/de';
dayjs.extend(utc);
dayjs.extend(timezone);
dayjs.extend(relativeTime);
dayjs.locale('de');
// Standard-Zeitzone
const DEFAULT_TZ = 'Europe/Berlin';
// Format-Presets
export const DATE_FORMATS = {
full: 'DD. MMMM YYYY (ddd) HH:mm',
date: 'DD. MMMM YYYY',
dateShort: 'DD.MM.',
time: 'HH:mm',
iso: 'YYYY-MM-DDTHH:mm:ssZ',
api: 'YYYY-MM-DD',
} as const;
/**
* UTC-Datumsstring in lokaler Zeitzone formatieren
*/
export function formatDate(
date: string | Date,
format: keyof typeof DATE_FORMATS = 'date'
): string {
return dayjs(date).tz(DEFAULT_TZ).format(DATE_FORMATS[format]);
}
/**
* Relative Zeit zurückgeben ("vor 3 Minuten", "vor 2 Stunden", "gestern" usw.)
*/
export function timeAgo(date: string | Date): string {
const d = dayjs(date);
const now = dayjs();
const diffHours = now.diff(d, 'hour');
if (diffHours < 1) {
const diffMinutes = now.diff(d, 'minute');
if (diffMinutes < 1) return 'gerade eben';
return `vor ${diffMinutes} Minuten`;
}
if (diffHours < 24) return `vor ${diffHours} Stunden`;
if (diffHours < 48) return 'gestern';
if (diffHours < 168) return `vor ${Math.floor(diffHours / 24)} Tagen`;
return formatDate(date, 'date');
}
/**
* Zeitzonenkonvertierung
*/
export function convertTimezone(
date: string | Date,
fromTz: string,
toTz: string
): dayjs.Dayjs {
return dayjs.tz(date, fromTz).tz(toTz);
}
/**
* Prüfen, ob es ein Arbeitstag ist
*/
export function isBusinessDay(date: string | Date): boolean {
const d = dayjs(date);
const dayOfWeek = d.day();
return dayOfWeek !== 0 && dayOfWeek !== 6; // Sonntag=0, Samstag=6
}
/**
* Datum N Arbeitstage in der Zukunft ermitteln
*/
export function addBusinessDays(date: string | Date, days: number): dayjs.Dayjs {
let current = dayjs(date);
let remaining = days;
while (remaining > 0) {
current = current.add(1, 'day');
if (isBusinessDay(current.toDate())) {
remaining--;
}
}
return current;
}
Natives Formatieren mit der Intl API
Auch ohne Bibliotheken können viele Formatierungen mit der Browser-Intl-API durchgeführt werden.
// src/lib/intl-date.ts
/**
* Datumsformatierung mit Intl.DateTimeFormat
*/
export function formatDateIntl(date: Date, style: 'long' | 'short' = 'long'): string {
return new Intl.DateTimeFormat('de-DE', {
year: 'numeric',
month: style === 'long' ? 'long' : 'numeric',
day: 'numeric',
weekday: style === 'long' ? 'short' : undefined,
}).format(date);
}
/**
* Differenz zwischen zwei Daten in lesbarer Form anzeigen
*/
export function formatDateRange(start: Date, end: Date): string {
return new Intl.DateTimeFormat('de-DE', {
year: 'numeric',
month: 'short',
day: 'numeric',
}).formatRange(start, end);
}
/**
* Relatives Zeitformat
*/
export function formatRelative(date: Date): string {
const rtf = new Intl.RelativeTimeFormat('de', { numeric: 'auto' });
const now = new Date();
const diffMs = date.getTime() - now.getTime();
const diffSec = Math.round(diffMs / 1000);
const diffMin = Math.round(diffSec / 60);
const diffHour = Math.round(diffMin / 60);
const diffDay = Math.round(diffHour / 24);
if (Math.abs(diffSec) < 60) return rtf.format(diffSec, 'second');
if (Math.abs(diffMin) < 60) return rtf.format(diffMin, 'minute');
if (Math.abs(diffHour) < 24) return rtf.format(diffHour, 'hour');
return rtf.format(diffDay, 'day');
}
Verwendung in React-Komponenten
// src/components/TimeDisplay.tsx
'use client';
import { useState, useEffect } from 'react';
import { timeAgo } from '@/lib/date-utils';
export function TimeDisplay({ date }: { date: string }) {
const [display, setDisplay] = useState(timeAgo(date));
useEffect(() => {
const interval = setInterval(() => {
setDisplay(timeAgo(date));
}, 60000); // Jede Minute aktualisieren
return () => clearInterval(interval);
}, [date]);
return (
<time dateTime={date} title={new Date(date).toLocaleString('de-DE')}>
{display}
</time>
);
}
Häufige Fallstricke
- Zeitzone nicht berücksichtigt: Wenn Server und Client unterschiedliche Zeitzonen haben, immer in UTC speichern und auf dem Client konvertieren
- Sommerzeit: In einigen Ländern zu beachten, besonders bei internationalen Nutzern
- Date.parse()-Verhalten: Unterschiede zwischen Browsern, daher mit day.js etc. parsen
Verwandte Artikel
Zur Internationalisierung allgemein siehe den i18n-Implementierungsleitfaden, zur Währungsformatierung die Implementierung der Währungsformatierung.
Die offizielle day.js-Dokumentation (day.js.org) bietet eine Übersicht über die verfügbaren Plugins.
Related Posts
So beschleunigen Sie Ihre Nebenprojekte mit Claude Code [Mit Beispielen]
Erfahren Sie, wie Sie persönliche Entwicklungsprojekte mit Claude Code drastisch beschleunigen. Inklusive realer Beispiele und eines praktischen Workflows von der Idee bis zum Deployment.
So automatisieren Sie Refactoring mit Claude Code
Erfahren Sie, wie Sie Code-Refactoring mit Claude Code effizient automatisieren. Inklusive praktischer Prompts und konkreter Refactoring-Muster für reale Projekte.
Vollständiger CORS-Konfigurationsleitfaden mit Claude Code
Erfahren Sie alles über die CORS-Konfiguration mit Claude Code. Mit praktischen Tipps und Codebeispielen.