514 Stimmen

Datum in eine andere Zeitzone in JavaScript konvertieren

Ich bin auf der Suche nach einer Funktion, mit der ich das Datum einer Zeitzone in eine andere umwandeln kann.

Es werden zwei Parameter benötigt,

  • Datum (im Format "2012/04/10 10:10:30 +0000")
  • Zeitzone string ("Asien/Jakarta")

Die Zeitzonenzeichenfolge wird beschrieben in http://en.wikipedia.org/wiki/Zone.tab

Gibt es eine einfache Möglichkeit, dies zu tun?

1voto

Alexandre Liscia Punkte 315

Ich habe dies kürzlich in Typescript getan:

// fromTimezone example : Europe/Paris, toTimezone example: Europe/London
private calcTime( fromTimezone: string, toTimezone: string, dateFromTimezone: Date ): Date {
  const dateToGetOffset = new Date( 2018, 5, 1, 12 );

  const fromTimeString = dateToGetOffset.toLocaleTimeString( "en-UK", { timeZone: fromTimezone, hour12: false } );
  const toTimeString = dateToGetOffset.toLocaleTimeString( "en-UK", { timeZone: toTimezone, hour12: false } );

  const fromTimeHours: number = parseInt( fromTimeString.substr( 0, 2 ), 10 );
  const toTimeHours: number = parseInt( toTimeString.substr( 0, 2 ), 10 );

  const offset: number = fromTimeHours - toTimeHours;

  // convert to msec
  // add local time zone offset
  // get UTC time in msec
  const dateFromTimezoneUTC = Date.UTC( dateFromTimezone.getUTCFullYear(),
    dateFromTimezone.getUTCMonth(),
    dateFromTimezone.getUTCDate(),
    dateFromTimezone.getUTCHours(),
    dateFromTimezone.getUTCMinutes(),
    dateFromTimezone.getUTCSeconds(),
  );

  // create new Date object for different city
  // using supplied offset
  const dateUTC = new Date( dateFromTimezoneUTC + ( 3600000 * offset ) );

  // return time as a string
  return dateUTC;
}

Ich verwende das Format "en-UK", weil es so einfach ist. Es hätte auch "en-US" oder ein anderes Format sein können.

Wenn das erste Argument Ihre lokale Zeitzone und das zweite Ihre Zielzeitzone ist, wird ein Date-Objekt mit dem richtigen Offset zurückgegeben.

0voto

黄雨伞 Punkte 1736

Ich kenne keine einfache Methode, um ein Datumsobjekt in eine beliebige Zeitzone zu konvertieren, aber wenn Sie es in die lokale Zeitzone konvertieren wollen, können Sie es einfach mit Date.prototype.getTime() auf die entsprechende Anzahl von Millisekunden und wieder zurück.

let date0 = new Date('2016-05-24T13:07:20');
let date1 = new Date(date0.getTime());

console.log(`${date0}\n${date1}`);

Zum Beispiel, date.getHours() wird nun zurückgegeben 15 代わりに 13 wenn Sie, wie ich, in Österreich sind (und es ist Sommer).

Ich habe gelesen, dass die verschiedenen datetime-Funktionen in einigen Browsern ein nicht standardisiertes Verhalten zeigen können, also testen Sie dies zuerst. Ich kann bestätigen, dass es in Chrome funktioniert.

0voto

Muhammad Azeem Punkte 81

Stellen Sie einfach die gewünschte Zeitzone Ihres Landes ein und Sie können sie mit der Funktion SetInteval() nach jeweils einer Minute aktualisieren. Die Funktion formatAMPM() verwaltet das 12-Stunden-Format und die AM/PM-Zeitanzeige.

$(document).ready(function(){
        var pakTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Karachi"});
        pakTime = new Date(pakTime);

        var libyaTime = new Date().toLocaleString("en-US", {timeZone: "Africa/Tripoli"});
        libyaTime = new Date(libyaTime);

         document.getElementById("pak").innerHTML = "PAK  "+formatAMPM(pakTime);
         document.getElementById("ly").innerHTML = "LY   " +formatAMPM(libyaTime);

        setInterval(function(today) {
            var pakTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Karachi"});
            pakTime = new Date(pakTime);

            var libyaTime = new Date().toLocaleString("en-US", {timeZone: "Africa/Tripoli"});
            libyaTime = new Date(libyaTime);

           document.getElementById("pak").innerHTML = "PAK  "+formatAMPM(pakTime);
           document.getElementById("ly").innerHTML = "LY  " +formatAMPM(libyaTime);

        },10000);

         function formatAMPM(date) {
            var hours = date.getHours();
            var minutes = date.getMinutes();
            var ampm = hours >= 12 ? 'pm' : 'am';
            hours = hours % 12;
            hours = hours ? hours : 12; // the hour '0' should be '12'
            minutes = minutes < 10 ? '0'+minutes : minutes;
            var strTime = hours + ':' + minutes + ' ' + ampm;
            return strTime;
        }

    });

0voto

Kevin Punkte 9

Es gibt ein npm-Modul namens timezones.json die Sie dafür verwenden können. Es besteht im Wesentlichen aus einer json-Datei mit Objekten, die Informationen zur Sommerzeit und zum Offset enthalten.

Für asien/jakarta wäre es in der Lage, dieses Objekt zurückzugeben:

{
  "value": "SE Asia Standard Time",
  "abbr": "SAST",
  "offset": 7,
  "isdst": false,
  "text": "(UTC+07:00) Bangkok, Hanoi, Jakarta",
  "utc": [
    "Antarctica/Davis",
    "Asia/Bangkok",
    "Asia/Hovd",
    "Asia/Jakarta",
    "Asia/Phnom_Penh",
    "Asia/Pontianak",
    "Asia/Saigon",
    "Asia/Vientiane",
    "Etc/GMT-7",
    "Indian/Christmas"
  ]
}

Sie können es hier finden:

https://github.com/dmfilipenko/timezones.json

https://www.npmjs.com/package/timezones.json

Ich hoffe, es ist nützlich

0voto

Ashish Ranjan Punkte 12532

Ich hatte Probleme mit der Moment Zeitzone . Ich füge diese Antwort nur so, wenn jemand anderes das gleiche Problem konfrontiert. Ich habe also eine Datumszeichenfolge 2018-06-14 13:51:00 von meinem API . Ich weiß, dass dies in UTC aber die Zeichenfolge spricht nicht für sich selbst.

Ich lasse moment timezone wissen, aus welcher Zeitzone dieses Datum stammt, indem ich es mache:

let uTCDatetime = momentTz.tz("2018-06-14 13:51:00", "UTC").format();
// If your datetime is from any other timezone then add that instead of "UTC"
// this actually makes the date as : 2018-06-14T13:51:00Z

Nun möchte ich sie in eine bestimmte Zeitzone umwandeln:

let dateInMyTimeZone = momentTz.tz(uTCDatetime, "Asia/Kolkata").format("YYYY-MM-DD HH:mm:ss");
// now this results into: 2018-06-14 19:21:00, which is the corresponding date in my timezone.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X