Einleitung: Warum reicht der Standard Date() nicht aus?
Das eingebaute Date-Objekt in JavaScript ist ein leistungsstarkes, aber nicht immer praktisches Werkzeug. Bei der Entwicklung komplexer Anwendungen auf Node.js (z. B. Aufgabenplaner, Analysesysteme oder Finanzdienstleistungen) stoßen Entwickler auf eine Reihe von Problemen:
- Veränderbarkeit: Methoden wie
setMonth()ändern das ursprüngliche Objekt. - Begrenzte Zeitzonenunterstützung:
Datearbeitet nur mit lokaler Zeit und UTC. - Komplexität der Formatierung: Es gibt kein eingebautes Analogon zu
strftime. - String-Parsing:
new Date("2023-13-01")wirft keinen Fehler, sondern erstellt "2024-01-01".
In diesem Artikel betrachten wir fortgeschrittene Ansätze für die Arbeit mit Datum und Uhrzeit in Node.js, die helfen, diese Probleme zu vermeiden und zuverlässigeren Code zu schreiben.
1. Intl.DateTimeFormat: Formatierung ohne externe Abhängigkeiten
Modernes JavaScript (ES6+) bietet eine eingebaute Internationalisierungs-API Intl.DateTimeFormat. Dies ist ein leistungsstarkes Werkzeug, das es ermöglicht, Datum und Uhrzeit für jedes Gebietsschema zu formatieren, ohne Drittanbieter-Bibliotheken einzubinden.
Grundlegende Verwendung
const date = new Date('2024-03-15T14:30:00Z');
// Formatierung für das russische Gebietsschemaconst formatterRU = new Intl.DateTimeFormat('ru-RU', { year: 'numeric', month: 'long', day: 'numeric', weekday: 'long', hour: '2-digit', minute: '2-digit'});
console.log(formatterRU.format(date));// "пятница, 15 марта 2024 г., 17:30"Erweiterte Optionen: Zeitzonen und relative Zeit
// Formatierung unter Berücksichtigung der Zeitzoneconst formatterTZ = new Intl.DateTimeFormat('en-US', { timeZone: 'America/New_York', dateStyle: 'full', timeStyle: 'short'});console.log(formatterTZ.format(date));// "Friday, March 15, 2024 at 10:30 AM"
// Relative Formatierung (Intl.RelativeTimeFormat)const rtf = new Intl.RelativeTimeFormat('ru', { numeric: 'auto' });console.log(rtf.format(-5, 'day')); // "5 дней назад"console.log(rtf.format(2, 'month')); // "через 2 месяца"Dieser Ansatz ist ideal, wenn Sie unnötige Abhängigkeiten vermeiden, aber eine flexible Formatierung für die Benutzeroberfläche benötigen.
2. Die date-fns Bibliothek: Modularität und Funktionalität
date-fns ist eine moderne Bibliothek, die auf den Prinzipien der funktionalen Programmierung aufbaut. Ihr Hauptvorteil ist die Modularität: Sie importieren nur die Funktionen, die Sie benötigen, was die Bündelgröße erheblich reduziert.
Installation und grundlegende Beispiele
// Installation: npm install date-fnsimport { format, addDays, subMonths, differenceInDays, isWeekend } from 'date-fns';import { ru } from 'date-fns/locale';
const today = new Date();
// Formatierung mit Gebietsschemaconsole.log(format(today, 'dd MMMM yyyy, EEEE', { locale: ru }));// "15 марта 2024, пятница"
// Datumsarithmetikconst nextWeek = addDays(today, 7);const lastMonth = subMonths(today, 1);
// Differenz zwischen Datenconst diff = differenceInDays(nextWeek, today);console.log(diff); // 7
// Wochenende-Prüfungconsole.log(isWeekend(today)); // true oder falseKomplexe Szenarien: Vergleich und Validierung
import { parse, isValid, isBefore, isAfter, startOfMonth, endOfMonth } from 'date-fns';
// Sicheres Parsingconst parsed = parse('2024-13-01', 'yyyy-MM-dd', new Date());console.log(isValid(parsed)); // false — ungültiges Datum
// Arbeiten mit Bereichenconst start = startOfMonth(new Date(2024, 2, 1)); // 1. Märzconst end = endOfMonth(new Date(2024, 2, 1)); // 31. März
const targetDate = new Date(2024, 2, 15);if (isAfter(targetDate, start) && isBefore(targetDate, end)) { console.log('Das Datum liegt im März 2024');}date-fns