436 Stimmen

Liegt das Javascript-Datumsobjekt immer einen Tag daneben?

In meiner Java Script Anwendung habe ich das Datum in einem Format wie folgt gespeichert:

2011-09-24

Wenn ich nun versuche, mit dem obigen Wert ein neues Date-Objekt zu erstellen (damit ich das Datum in einem anderen Format abrufen kann), wird das Datum immer um einen Tag falsch angezeigt. Siehe unten:

var date = new Date("2011-09-24");
console.log(date);

Protokolle:

Fri Sep 23 2011 20:00:00 GMT-0400 (Eastern Daylight Time)

8voto

cmartin Punkte 2619

Das hat mich umgehauen, +1 auf die Antwort von zzzBov. Hier ist eine vollständige Konvertierung eines Datums, die für mich mit der UTC-Methoden gearbeitet:

//myMeeting.MeetingDate = '2015-01-30T00:00:00'

var myDate = new Date(myMeeting.MeetingDate);
//convert to JavaScript date format
//returns date of 'Thu Jan 29 2015 19:00:00 GMT-0500 (Eastern Standard Time)' <-- One Day Off!

myDate = new Date(myDate.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate());
//returns date of 'Fri Jan 30 2015 00:00:00 GMT-0500 (Eastern Standard Time)' <-- Correct Date!

5voto

Brian Risk Punkte 1048

Obwohl im Fall des Auftraggebers die Zeitzone EDT ist, gibt es keine Garantie dafür, dass der Benutzer, der Ihr Skript ausführt, sich in der EDT-Zeitzone befindet, so dass die Festcodierung des Offsets nicht unbedingt funktionieren wird. Die Lösung, die ich gefunden habe, teilt die Datumszeichenfolge auf und verwendet die separaten Werte im Date-Konstruktor.

var dateString = "2011-09-24";
var dateParts = dateString.split("-");
var date = new Date(dateParts[0], dateParts[1] - 1, dateParts[2]);

Beachten Sie, dass Sie für ein anderes Stück von JS Seltsamkeit Konto: der Monat ist Null-basierte.

5voto

Gabe Gates Punkte 784

Ich bin auf genau dieses Problem gestoßen, als mein Kunde auf Atlantic Standard Time war. Der Datumswert, den der Client abrief, war "2018-11-23" und wenn der Code es in new Date("2018-11-23") die Ausgabe für den Kunden war für den Vortag. Ich habe eine Dienstprogrammfunktion erstellt, wie im Ausschnitt gezeigt, die das Datum normalisiert und dem Kunden das erwartete Datum liefert.

date.setMinutes(date.getMinutes() + date.getTimezoneOffset());

var normalizeDate = function(date) {
  date.setMinutes(date.getMinutes() + date.getTimezoneOffset());
  return date;
};

var date = new Date("2018-11-23");

document.getElementById("default").textContent = date;
document.getElementById("normalized").textContent = normalizeDate(date);

<h2>Calling new Date("2018-11-23")</h2>
<div>
  <label><b>Default</b> : </label>
  <span id="default"></span>
</div>
<hr>
<div>
  <label><b>Normalized</b> : </label>
  <span id="normalized"></span>
</div>

4voto

Sie können die Moment-Bibliothek verwenden, um das Datum zu formatieren. https://momentjs.com/

let format1 = "YYYY-MM-DD"
let date = new Date();

console.log(moment(date).format(format1))

EDIT

Der Moment ist jetzt veraltet, Sie können verwenden datum-fns Format Methode zur Formatierung eines Datums.

import { format } from 'date-fns'
format(new Date(), "yyyy-MM-dd")

4voto

Xamage Punkte 31

Meine Lösung, um ein ISO-Datum zu analysieren, ohne von der Zeitzone gestört zu werden, besteht darin, ein "T12:00:00" am Ende hinzuzufügen, bevor ich es analysiere, denn wenn es in Greenwich Mittag ist, hat die ganze Welt den gleichen Tag:

function toDate(isoDateString) {
  // isoDateString is a string like "yyyy-MM-dd"
  return new Date(`${isoDateString}T12:00:00`);
}

Vorher:

> new Date("2020-10-06")
> Date Mon Oct 05 2020 14:00:00 GMT-1000 (heure normale d’Hawaii - Aléoutiennes)

Danach:

> toDate("2020-10-06")
> Date Tue Oct 06 2020 12:00:00 GMT-1000 (heure normale d’Hawaii - Aléoutiennes)

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