Website-Suche

Datum ohne Zeitzone in JavaScript parsen


Ich möchte ein Datum ohne Zeitzone in JavaScript parsen. Ich habe es versucht:

new Date(Date.parse("2005-07-08T00:00:00+0000"));

Welche Fri Jul 08 2005 02:00:00 GMT+0200 (Mitteleuropäische Sommerzeit) zurückgab:

new Date(Date.parse("2005-07-08 00:00:00 GMT+0000"));

gibt dasselbe Ergebnis zurück und:

new Date(Date.parse("2005-07-08 00:00:00 GMT-0000"));

gibt ebenfalls dasselbe Ergebnis zurück.

Ich möchte Zeit parsen:

  1. ohne Zeitzone.
  2. ohne einen Konstruktor Date.UTC oder new Date(Jahr, Monat, Tag) aufzurufen.
  3. indem man einfach einen String an den Date-Konstruktor übergibt (ohne Prototype-Ansätze).

Ich muss ein Date-Objekt erzeugen, nicht einen String.

Antwort #1

Ich hatte dasselbe Problem. Ich bekomme ein Datum als String, zum Beispiel: '2016-08-25T00:00:00', aber ich muss das Datumsobjekt mit der richtigen Uhrzeit haben. Um String in ein Objekt zu konvertieren, verwende ich getTimezoneOffset:

var date = new Date('2016-08-25T00:00:00')
var userTimezoneOffset = date.getTimezoneOffset() * 60000;
new Date(date.getTime() + userTimezoneOffset);

getTimezoneOffset() gibt entweder einen negativen oder positiven Wert zurück. Dieser muss subtrahiert werden, um an jedem Ort der Welt zu funktionieren.

Antwort #2

Das Datum wird korrekt geparst, es ist nur toString, das den Zeitstempel in Ihrer lokalen Zeitzone anzeigt:

let s = "2005-07-08T11:22:33+0000";
let d = new Date(Date.parse(s));

// this logs for me 
// "Fri Jul 08 2005 13:22:33 GMT+0200 (Central European Summer Time)" 
// and something else for you

console.log(d.toString()) 

// this logs
// Fri, 08 Jul 2005 11:22:33 GMT
// for everyone

console.log(d.toUTCString())

Javascript-Date-Objekte sind Zeitwerte - sie enthalten lediglich eine Anzahl von Millisekunden seit dem Epoch. Es gibt keine Zeitzoneninformationen in einem Date-Objekt. Welches Kalenderdatum (Tag, Minuten, Sekunden) dieser Zeitstempel darstellt, ist eine Frage der Interpretation (eine der to...String-Methoden).

Das obige Beispiel zeigt, dass das Datum für den Offset +0000 korrekt geparst wird - das heißt, es enthält tatsächlich eine Anzahl von Millisekunden, die "2005-07-08T11:22:33" in GMT entspricht.

Antwort #3

Da es sich wirklich um ein Formatierungsproblem bei der Anzeige des Datums handelt (z. B. wird in der Ortszeit angezeigt), verwende ich gerne das neue (oder eher neue) Intl.DateTimeFormat-Objekt, um die Formatierung durchzuführen, da es expliziter ist und mehr Ausgabeoptionen bietet:

const dateOptions = { timeZone: 'UTC', month: 'long', day: 'numeric', year: 'numeric' };

const dateFormatter = new Intl.DateTimeFormat('en-US', dateOptions);
const dateAsFormattedString = dateFormatter.format(new Date('2019-06-01T00:00:00.000+00:00'));

console.log(dateAsFormattedString) // "June 1, 2019"

Wie gezeigt, wird durch das Setzen der timeZone auf 'UTC' keine lokale Umrechnung durchgeführt. Als Bonus ermöglicht es Ihnen auch, ausgefeiltere Ausgaben zu erstellen. Sie können mehr über das Intl.DateTimeFormat-Objekt bei Mozilla - Intl.DateTimeFormat lesen.

Die gleiche Funktionalität kann erreicht werden, ohne ein neues Intl.DateTimeFormat-Objekt zu erstellen. Übergeben Sie einfach die Sprach- und Datumsoptionen direkt an die toLocaleDateString()-Funktion.

const dateOptions = { timeZone: 'UTC', month: 'long', day: 'numeric', year: 'numeric' };
const myDate = new Date('2019-06-01T00:00:00.000+00:00');
myDate.toLocaleDateString('en-US', dateOptions); // "June 1, 2019"

Antwort #4

Ich bin auf dasselbe Problem gestoßen und erinnerte mich dann an etwas Seltsames an einem Altsystemprojekt, an dem ich gearbeitet habe, und wie sie dieses Problem gelöst haben. Ich habe es damals nicht verstanden und mich nicht wirklich darum gekümmert, bis ich selbst auf das Problem gestoßen bin.

var date = '2014-01-02T00:00:00.000Z'
date = date.substring(0,10).split('-')
date = date[1] + '-' + date[2] + '-' + date[0]

new Date(date) #Thu Jan 02 2014 00:00:00 GMT-0600

Aus welchem Grund auch immer setzt das Übergeben des Datums als "01-02-2014" die Zeitzone auf null und ignoriert die Zeitzone des Benutzers. Dies könnte ein Zufall in der Date-Klasse sein, aber es existierte schon vor einiger Zeit und existiert heute noch. Und es scheint browserübergreifend zu funktionieren. Probieren Sie es selbst aus.

Dieser Code wird in einem globalen Projekt implementiert, bei dem Zeitzonen sehr wichtig sind, aber die Person, die sich das Datum ansieht, hat sich nicht um den genauen Zeitpunkt gekümmert, zu dem es eingeführt wurde.

Antwort #5

Ich habe auf YouTube das JavaScript Date-Objekt und Zeitzonen | Behebung eines „um 1 Tag zu spät“-Bugs gefunden. Dies korrigiert/setzt den Offset für die lokale Zeitzone zurück. Es gibt eine großartige Erklärung zu diesem Problem im Video.

// date as YYYY-MM-DDT00:00:00Z

let dateFormat = new Date(date)

// Methods on Date Object will convert from UTC to users timezone
// Set minutes to current minutes (UTC) + User local time UTC offset

dateFormat.setMinutes(dateFormat.getMinutes() + dateFormat.getTimezoneOffset())

// Now we can use methods on the date obj without the timezone conversion

let dateStr = dateFormat.toDateString();

Verwandte Artikel