Ich hatte das gleiche Problem wie OP, was mich auf diesen Thread und viele andere brachte. Keine der Antworten waren in der Lage, "initialisieren ein JavaScript Datum zu einer bestimmten Zeitzone".
Mein Szenario war ein Benutzer, der ein Datum und eine Zeitzone (für eine Besprechung) auswählt, also ob in Unix-Zeitstempel, oder UTC, usw., benötigt, dass dateTime in einer bestimmten Zeitzone zu sein, ohne den Offset von der lokalen Zeit des Benutzers zu wissen. Beispiel: Ein Benutzer in der Region ? muss eine Besprechung für 10:30 CST ansetzen, ohne die Abweichung von der Ortszeit zu kennen. Es ist erstaunlich schwierig, eine bestimmte Datumszeit von einer anderen Datumszeit aus festzulegen.
Die folgende Lösung instanziiert ein dateTime-Objekt in einer nicht lokalen Zeitzone oder konvertiert ein dateTime-Objekt in eine andere Zeitzone, wobei die ursprünglich eingestellte Zeit beibehalten wird. Es ist kompatibel mit allen modernen Browsern (und ziemlich weit zurück), tut nichts Fragwürdiges mit Browser-Apis und nimmt IANA-Datums-Strings auf.
const setDateInAnotherTimeZone=(inputDateTime, timeZone)=>{
/**
* This funciton will instantiate a dateTime object in a non local timezone
* or
* Converts a dateTime object to a different timezone, while maintining the time
* Parameters
** inputDateTime, a date object with the desired time and day selected (in the local/non-desired timezone)
*** Example: new Date(2023, 10, 10, 10, 30) 10:30 (localalized to user timezone) on 10/30/2023
** timeZone, the desired timezone you want to set the date in.
*** Example: var timeZone = 'US/Central'
*** Requires a 'tz database time zone' name aka an IANA timezone name
*** Usefull list here https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
*** Date.prototype.toLocaleString() usng IANA time zone names is widely supported
*** https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString#browser_compatibility
*/
console.log('desired Time Zone',timeZone)
console.log('desired Time ', inputDateTime.toString().split(" ").slice(4,5).join(' ').toString())
console.log('inputDateTime', inputDateTime)
const dateTZShifted = inputDateTime.toLocaleString("en-US", {timeZone : timeZone , dateStyle: 'long', timeStyle: 'long'})
let timeTZShifted = dateTZShifted.split(" ").slice(4,5).join(' ').toString().split(':')
var originalTime = inputDateTime.toString().split(" ").slice(4,5).join(' ').toString().split(':')
let newLocalTime = [
Number(originalTime[0]) - Number(timeTZShifted[0]) + Number(originalTime[0]) ,
Number(originalTime[1]) - Number(timeTZShifted[1]) + Number(originalTime[1]) ,
Number(originalTime[2]) -Number(timeTZShifted[2]) + Number(originalTime[2])
]
let outputDate = new Date(inputDateTime)
outputDate.setHours(Number(newLocalTime[0]), Number(newLocalTime[1]),Number(newLocalTime[2]))
console.log('outputDateTime ', outputDate.toLocaleString("en-US", {timeZone : timeZone , dateStyle: 'long', timeStyle: 'long'}) )
return(outputDate)
}
//Usage
let dateInAnotherTimeZone = setDateInAnotherTimeZone(new Date(2023, 7, 10, 10, 30),'US/Central')
let dateInAnotherTimeZone1 = setDateInAnotherTimeZone(DateObject,'America/New_York')
Erwartetes Ergebnis
gewünschte Zeitzone US/Central
gewünschte Zeit 10:30:00
inputDateTime
Thu Aug 10 2023 10:30:00 GMT-0400 (Eastern Daylight Time)
outputDateTime
August 10, 2023 um 10:30:00 AM CDT
o
Thu Aug 10 2023 11:30:00 GMT-0400 (Eastern Daylight Time)