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åntoLocalStringmedDate-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 avDate-objektet är dess Unix-tidsstämpel, som kan ses med.valueOf(),.getTime(), eller någon mekanism som tvingar det till ettNumber. 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 ettDate-objekt i en annan tidszon, erkänn att allaDate-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ändatoLocaleStringmedtimeZone-alternativet) men du kan inte skapa ett nyttDate-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 ettZonedDateTimefrån TC39 Temporal Proposal, som så småningom kommer att bli en del av ECMAScript.Var försiktig med att kalla
console.logpå ettDate-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 tillDate-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 loggaDate-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.
