641 Stimmen

So initialisieren Sie ein JavaScript-Datum für eine bestimmte Zeitzone

Ich habe eine Datumszeit in einer bestimmten Zeitzone als Zeichenkette und möchte diese in die Ortszeit umwandeln. Aber ich weiß nicht, wie ich die Zeitzone im Date-Objekt einstellen kann.

Ich habe zum Beispiel Feb 28 2013 7:00 PM ET, dann kann ich

var mydate = new Date();
mydate.setFullYear(2013);
mydate.setMonth(02);
mydate.setDate(28);
mydate.setHours(7);
mydate.setMinutes(00);  

Soviel ich weiß, kann ich entweder die UTC-Zeit oder die Ortszeit einstellen. Aber wie kann ich die Zeit in einer anderen Zeitzone einstellen?

Ich habe versucht, den Offset von UTC zu addieren/subtrahieren, aber ich weiß nicht, wie ich die Sommerzeit ausgleichen kann. Ich bin nicht sicher, ob ich die richtige Richtung eingeschlagen habe.

Wie kann ich über die Umwandlung von Zeit aus einer anderen Zeitzone in die lokale Zeit in Javascript gehen?

212voto

commonpike Punkte 9386

Wie Matt Johnson sagte

Wenn Sie Ihre Nutzung auf moderne Webbrowser beschränken können, können Sie jetzt die folgendes ohne spezielle Bibliotheken tun:

new Date().toLocaleString("en-US", {timeZone: "America/New_York"})

Dies ist keine umfassende Lösung, aber sie funktioniert für viele Szenarien die nur eine Ausgabekonvertierung erfordern (von UTC oder Ortszeit in eine bestimmte Zeitzone, aber nicht in die andere Richtung).

Obwohl der Browser also keine IANA-Zeitzonen lesen kann, wenn er ein Datum erstellt, oder über Methoden verfügt, um die Zeitzonen eines bestehenden Datumsobjekts zu ändern, scheint es einen Hack zu geben, der dieses Problem umgeht:

function changeTimezone(date, ianatz) {

  // suppose the date is 12:00 UTC
  var invdate = new Date(date.toLocaleString('en-US', {
    timeZone: ianatz
  }));

  // then invdate will be 07:00 in Toronto
  // and the diff is 5 hours
  var diff = date.getTime() - invdate.getTime();

  // so 12:00 in Toronto is 17:00 UTC
  return new Date(date.getTime() - diff); // needs to substract

}

// E.g.
var here = new Date();
var there = changeTimezone(here, "America/Toronto");

console.log(`Here: ${here.toString()}\nToronto: ${there.toString()}`);

75voto

chickens Punkte 14182

Damit sollte Ihr Problem gelöst sein, aber Sie können auch gerne Korrekturen anbieten. Bei dieser Methode wird auch die Sommerzeit für das angegebene Datum berücksichtigt.

dateWithTimeZone = (timeZone, year, month, day, hour, minute, second) => {
  let date = new Date(Date.UTC(year, month, day, hour, minute, second));

  let utcDate = new Date(date.toLocaleString('en-US', { timeZone: "UTC" }));
  let tzDate = new Date(date.toLocaleString('en-US', { timeZone: timeZone }));
  let offset = utcDate.getTime() - tzDate.getTime();

  date.setTime( date.getTime() + offset );

  return date;
};

Verwendung mit Zeitzone und Ortszeit:

dateWithTimeZone("America/Los_Angeles",2019,8,8,0,0,0)

10voto

Shaun Cockerill Punkte 742

Ich fand die am besten unterstützte Methode, dies zu tun, ohne sich um eine Bibliothek eines Drittanbieters zu kümmern, war die Verwendung von getTimezoneOffset um den entsprechenden Zeitstempel zu berechnen, oder aktualisieren Sie die Zeit und verwenden Sie dann die normalen Methoden, um das erforderliche Datum und die Uhrzeit zu erhalten.

var mydate = new Date();
mydate.setFullYear(2013);
mydate.setMonth(02);
mydate.setDate(28);
mydate.setHours(7);
mydate.setMinutes(00);

// ET timezone offset in hours.
var timezone = -5;
// Timezone offset in minutes + the desired offset in minutes, converted to ms.
// This offset should be the same for ALL date calculations, so you should only need to calculate it once.
var offset = (mydate.getTimezoneOffset() + (timezone * 60)) * 60 * 1000;

// Use the timestamp and offset as necessary to calculate min/sec etc, i.e. for countdowns.
var timestamp = mydate.getTime() + offset,
    seconds = Math.floor(timestamp / 1000) % 60,
    minutes = Math.floor(timestamp / 1000 / 60) % 60,
    hours   = Math.floor(timestamp / 1000 / 60 / 60);

// Or update the timestamp to reflect the timezone offset.
mydate.setTime(mydate.getTime() + offset);
// Then Output dates and times using the normal methods.
var date = mydate.getDate(),
    hour = mydate.getHours();

EDITAR

Ich benutzte bisher UTC Methoden bei der Durchführung der Datumsumwandlungen, was nicht korrekt war. Durch das Hinzufügen des Offsets zur Zeit, unter Verwendung der lokalen get Funktionen liefern die gewünschten Ergebnisse.

6voto

Stephen Romero Punkte 2672

Für Ionic-Benutzer, hatte ich die Hölle mit diesem, weil .toISOString() muss mit der html-Vorlage verwendet werden.

Damit wird das aktuelle Datum erfasst, aber natürlich können auch frühere Antworten für ein ausgewähltes Datum hinzugefügt werden.

Ich habe es hiermit repariert:

date = new Date();
public currentDate: any = new Date(this.date.getTime() - this.date.getTimezoneOffset()*60000).toISOString();

Die *60000 gibt die UTC -6 an, die CST ist, so dass die Nummer und die Differenz geändert werden können, egal welche Zeitzone benötigt wird.

6voto

smoore4 Punkte 3800

Ich bin auf dieses Problem gestoßen, als ich eine GCP-Cloud-Funktion ausgeführt habe. Natürlich funktioniert sie auf einem lokalen Rechner, aber wenn sie in der Cloud ausgeführt wird, wird das Betriebssystem standardmäßig (lokal) für new Date() irrelevant. In meinem Fall erforderte ein Api-Aufruf aus der Cloud die Eastern Standard Time im ISO-Format (ohne "Z") mit dem Offset "-0500" oder "-0400", je nach Sommerzeit, zum Beispiel:

2021-12-01T00:00:00.000-0500

Auch hier handelt es sich nicht um ein Formatierungsproblem des Browsers, so dass ich gezwungen bin, dieses Format zu verwenden, damit der API-Aufruf korrekt funktioniert.

Mit dem Code von @chickens als Ausgangspunkt hat es folgendermaßen funktioniert:

var date = new Date(); 
var now_utc =  Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),
date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());

var dt = new Date(now_utc);

let utcDate = new Date(dt.toLocaleString('en-US', { timeZone: "UTC" }));
let tzDate = new Date(dt.toLocaleString('en-US', { timeZone: "America/New_York" }));
let offset1 = utcDate.getTime() - tzDate.getTime();
let offset2 = offset1/60000;
let o1 = Math.abs(offset2);
console.log(offset2)
var offsetValue1 =  (offset2 < 0 ? "+" : "-") + ("00" + Math.floor(o1 / 60)).slice(-2) + ("00" + (o1 % 60)).slice(-2);
console.log(offsetValue1)
dt.setTime(dt.getTime() - offset1);

console.log(dt.toISOString());
console.log(dt.toISOString().slice(0,-1)+offsetValue1);

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