Hier ist der Einzeiler:
function convertTZ(date, tzString) {
return new Date((typeof date === "string" ? new Date(date) : date).toLocaleString("en-US", {timeZone: tzString}));
}
// usage: Asia/Jakarta is GMT+7
convertTZ("2012/04/20 10:10:30 +0000", "Asia/Jakarta") // Tue Apr 20 2012 17:10:30 GMT+0700 (Western Indonesia Time)
// Resulting value is regular Date() object
const convertedDate = convertTZ("2012/04/20 10:10:30 +0000", "Asia/Jakarta")
convertedDate.getHours(); // 17
// Bonus: You can also put Date object to first arg
const date = new Date()
convertTZ(date, "Asia/Jakarta") // current date-time in jakarta.
Dies ist die MDN-Referenz .
Achtung: Die obige Funktion funktioniert, indem sie sich auf das Ergebnis von toLocaleString verlässt, das eine Zeichenkette mit einem Datum ist, das in en-US
Gebietsschema, z.B. "4/20/2012, 5:10:30 PM"
. Jeder Browser akzeptiert möglicherweise nicht en-US
formatierte Datumszeichenfolge an den Date-Konstruktor übergeben, und es kann ein unerwartetes Ergebnis zurückgegeben werden (z. B. wird die Sommerzeit ignoriert).
Derzeit akzeptieren alle modernen Browser dieses Format und berechnen die Sommerzeit korrekt, bei älteren und/oder exotischen Browsern funktioniert es möglicherweise nicht.
Nebenbemerkung: Es wäre toll, wenn moderne Browser toLocaleDate haben Funktion haben, so dass wir nicht diese hacky Arbeit herum verwenden müssen.