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?

4voto

JRulle Punkte 7226

Ich lief in ein ähnliches Problem mit Unit-Tests (speziell in Jest, wenn die Unit-Tests lokal laufen, um die Snapshots zu erstellen und dann der CI-Server läuft in (möglicherweise) eine andere Zeitzone verursacht den Snapshot-Vergleich fehlschlagen). Ich spottete unsere Date und einige der unterstützenden Methoden wie diese:

describe('...', () => {
  let originalDate;

  beforeEach(() => {
    originalDate = Date;
    Date = jest.fn(
      (d) => {
        let newD;
        if (d) {
          newD = (new originalDate(d));
        } else {
          newD = (new originalDate('2017-05-29T10:00:00z'));
        }
        newD.toLocaleString = () => {
          return (new originalDate(newD.valueOf())).toLocaleString("en-US", {timeZone: "America/New_York"});
        };
        newD.toLocaleDateString = () => {
          return (new originalDate(newD.valueOf())).toLocaleDateString("en-US", {timeZone: "America/New_York"});
        };
        newD.toLocaleTimeString = () => {
          return (new originalDate(newD.valueOf())).toLocaleTimeString("en-US", {timeZone: "America/New_York"});
        };
        return newD;
      }
    );
    Date.now = () => { return (Date()); };
  });

  afterEach(() => {
    Date = originalDate;
  });

});

3voto

Dhanush Raja Punkte 47

Ich hatte das gleiche Problem, aber wir können die Zeitzone verwenden, die wir wollen
wir verwenden .toLocaleDateString()

z. B:

var day=new Date();
const options= {day:'numeric', month:'long', year:"numeric", timeZone:"Asia/Kolkata"};
const today=day.toLocaleDateString("en-IN", options);
console.log(today);

2voto

Mariusz Nowak Punkte 30152

Versuchen Sie es: Datum-von-Zeitzone wird das erwartete Datum mit Hilfe der nativ verfügbaren Intl.DateTimeFormat .

Ich benutze diese Methode schon seit einigen Jahren in einem meiner Projekte, aber jetzt habe ich beschlossen, sie als kleines OS-Projekt zu veröffentlichen :)

2voto

toddmo Punkte 18450

Ich bin mir nicht sicher, warum all diese Antworten so kompliziert sind. Benutzen Sie einfach YYYY-MM-DD ZZZ bei der Erstellung eines reinen Datums in der lokalen / gewünschten Zeitzone.

Erstellen Sie ein lokales Datum:

var myDate = new Date('2022-11-29 CST')

Das Datum wird im Speicher als UTC gespeichert, toll.

Holen Sie das Datum aus dem Speicher und zeigen Sie es als lokal an:

myDate.toLocaleDateString()

11/29/2022

2voto

Maxime Punkte 613

Dank der Antwort von @commonpike habe ich eine Funktion geschrieben, die ein ISO-String-Datum wie folgt annimmt 2020-10-10T08:00:00.000 als Eingabe und senden Sie ein Objekt, das 2 Haupteigenschaften enthält.

Die erste ist fromUtc ist ein Datum, das der als Parameter eingegebenen timeZone entspricht.

Die zweite ist toUtc die es Ihnen ermöglicht, ein Datum zu formatieren, das von fromUtc .

const timeZoneTransformer = (stringDate, timeZone = "Europe/Paris") => {
  const now = new Date();
  const serverDate = new Date(stringDate);
  const utcDate = new Date(
    Date.UTC(
      serverDate.getFullYear(),
      serverDate.getMonth(),
      serverDate.getDate(),
      serverDate.getHours(),
      serverDate.getMinutes(),
      serverDate.getSeconds()
    )
  );
  const invdate = new Date(
    serverDate.toLocaleString("en-US", {
      timeZone,
    })
  );
  const diff = now.getTime() - invdate.getTime();
  const adjustedDate = new Date(now.getTime() - diff);
  return {
    toUtc: utcDate,
    fromUtc: adjustedDate,
  };
};
const fromUtc = timeZoneTransformer("2020-10-10T08:00:00.000").fromUtc;
console.log(fromUtc);
const toUtc = timeZoneTransformer(fromUtc).toUtc;
console.log(toUtc);

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