Zum Inhalt springen
rdlabo.devdocs

Zeitzonen-Konvertierungen und ESLint gemeinsam ausprobieren

Ein einzelner Zeitpunkt kann zu unterschiedlichen Kalenderdaten gehören. Beobachten Sie zunächst diesen Unterschied und lassen Sie ESLint anschließend Code melden, der versehentlich auf die Zeitzone des Hosts zurückfällt.

1. Beide Pakete installieren

Benötigt Node.js 24 und npm.

mkdir timezone-demo
cd timezone-demo
npm init -y
npm pkg set type=module
npm install @rdlabo/workers-timezone@0.12.2
npm install --save-dev @rdlabo/eslint-plugin-rules@22.1.0 eslint@10 @eslint/js@10 typescript@6 typescript-eslint@8 tsx@4

2. Den Wechsel des Kalenderdatums beobachten

Speichern Sie dies als demo.ts. Initialisieren Sie die Anwendungszeitzone einmal auf Modulebene. Übergeben Sie für eine nutzerspezifische Konvertierung eine Zeitzone pro Aufruf.

import { initializeTimezone, toLocalDate, toLocalDateTime } from '@rdlabo/workers-timezone';

initializeTimezone({ timeZone: 'Asia/Tokyo' });
const instant = new Date('2026-01-01T15:00:00Z');
console.log(toLocalDateTime(instant));
console.log(toLocalDate(instant, 'America/New_York'));
npx tsx demo.ts
2026-01-02 00:00:00
2026-01-01

Derselbe Zeitpunkt liegt in Tokio am 2. Januar und in New York am 1. Januar. Ergänzen Sie ein ausdrückliches Zeitzonenargument für eine andere Stadt, um den Unterschied zu untersuchen.

3. Eine versehentliche Regression sichtbar machen

Speichern Sie dies als tsconfig.json, damit typgestütztes Linting demo.ts finden kann:

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "strict": true,
    "noEmit": true
  },
  "include": ["demo.ts"]
}

Speichern Sie dies als eslint.config.mjs. Beschränken Sie typgestützte Konfiguration auf TypeScript-Dateien:

import { dirname } from 'node:path';
import { fileURLToPath } from 'node:url';
import eslint from '@eslint/js';
import tseslint from 'typescript-eslint';
import rdlabo from '@rdlabo/eslint-plugin-rules/typescript';

export default tseslint.config(
  eslint.configs.recommended,
  {
    files: ['**/*.ts'],
    extends: [...tseslint.configs.recommendedTypeChecked],
    languageOptions: {
      parserOptions: {
        projectService: true,
        tsconfigRootDir: dirname(fileURLToPath(import.meta.url)),
      },
    },
    plugins: { '@rdlabo/rules': rdlabo },
  },
  ...rdlabo.configs['workers-timezone/recommended'],
);

Prüfen Sie das korrekte Beispiel:

npx eslint demo.ts

Es sollte ohne Diagnosemeldungen erfolgreich beendet werden. Ergänzen Sie jetzt die folgende absichtlich falsche Zeile in demo.ts:

console.log(instant.getDate());
npx eslint demo.ts

Zu erwarten sind ein Exit-Status ungleich null und @rdlabo/rules/no-implicit-timezone. getDate() liest den lokalen Kalendertag des Hosts und umgeht damit die Anwendungszeitzone. Ersetzen Sie ausschließlich die hinzugefügte Zeile durch:

console.log(toLocalDate(instant));
npx eslint demo.ts
npx tsx demo.ts

Lint sollte wieder erfolgreich sein. Die zuletzt hinzugefügte Zeile gibt 2026-01-02 aus.

4. In Ihrer Anwendung verwenden

Folgen Sie der Anwendungseinrichtung, um die Standardzeitzone zu wählen, und aktivieren Sie anschließend ESLint in CI. Nutzerspezifische Einstellungen, Sommerzeit und Datenbankgrenzen beschreibt Zeitzonen und Kalenderdaten.