typescript - Konvertera datum till en annan tidszon i JavaScript och skriv ut med korrekt tidszon


Jag behöver konvertera en lokal tidszon till Pacific/Los Angeles.

Exempel, om användaren är på Hawaii

Kod: tagen härifrån https://stackoverflow.com/a/54127122/15358601

function convertTZ(date, tzString) {
    return new Date((typeof date === "string" ? New Date(date) : date).toLocaleString("en-US", {timeZone: tzString}));   
}

convertTZ(new Date(), "America/Los_Angeles")

Sön 14 mar 2021 17:01:59 GMT-1000 (Hawaii-Aleutian standardtid) {}

Det skriver fortfarande ut slutet med Hawaii. Jag behöver America/Los Angeles-visning, inte Hawaii. (dock skriver det fortfarande ut de korrekta nya timmarna och minuterna, bara visningsetiketten är fel) Hur kan detta göras?

Lösningen bör fungera för andra tidszoner också, och skriva ut den respektive dess andra tidszon, t.ex.: America/New_York, Europe/London, Europe/Paris, etc.

Svar #1

Några saker:

  • Tillvägagångssättet i svaret du länkade till för convertTZ är felaktigt. Man bör inte analysera utdata från toLocalString med Date-konstruktorn. Vänligen läs kommentarerna som följer efter det svaret.

  • Date-objektet kan inte konverteras till en annan tidszon, eftersom det egentligen inte är i någon tidszon. Det enda som kapslas in av Date-objektet är dess Unix-tidsstämpel, som kan ses med .valueOf(), .getTime(), eller någon mekanism som tvingar det till ett Number. Sådana värden är alltid baserade på UTC.

  • När du ser lokal tid eller en tidszon som kommer från Date-objektet, tillämpas systemets lokala tidszon på den interna UTC-baserade Unix-tidsstämpeln för att skapa utdata. Den lokala tidszonen kan inte ändras programmatiskt från JavaScript (eller TypeScript), och den kan heller inte ändras på objektnivå.

  • Istället för att försöka konvertera ett Date-objekt i en tidszon till ett Date-objekt i en annan tidszon, erkänn att alla Date-objekt är i grunden UTC. Därför kan du skapa en sträng som är i en annan tidszon, (till exempel genom att använda toLocaleString med timeZone-alternativet) men du kan inte skapa ett nytt Date-objekt från den strängen. Om du vill ha ett objekt som faktiskt kan ställas in på en annan tidszon, överväg Luxon. Om du behöver en lösning utan ett bibliotek, kommer du en dag kunna använda ett ZonedDateTime från TC39 Temporal Proposal, som så småningom kommer att bli en del av ECMAScript.

  • Var försiktig med att kalla console.log på ett Date-objekt. Varken ECMAScript-specifikationen eller WhatWG Console-specifikationen definierar beteendet för ett sådant anrop. Det är odefinierat beteende. I vissa miljöer är den sträng som loggas samma som att anropa .toString() på Date-objektet - vilket ger den lokala tidens motsvarighet till Date-objektets tidsstämpel, tillsammans med ett visningsnamn för den lokala tidszonen. Andra miljöer visar samma resultat som att anropa .toISOString(), vilket ger en ISO-8601-representation av tidsstämpeln i UTC. Istället för att logga Date-objekt, anropa en av dessa två funktioner själv och logga resultatet.

Svar #2

Enligt ditt krav kommer https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/resolvedOptions att hjälpa till att uppnå det.

Relaterade artiklar