Ich möchte das Datum ohne Zeitzone in JavaScript analysieren. Ich habe versucht:
new Date(Date.parse("2005-07-08T00:00:00+0000"));
Rückgabe Fr 08.07.2005 02:00:00 GMT + 0200 (Mitteleuropäische Sommerzeit)
new Date(Date.parse("2005-07-08 00:00:00 GMT+0000"));
Gibt das gleiche Ergebnis zurück
new Date(Date.parse("2005-07-08 00:00:00 GMT-0000"));
Gibt das gleiche Ergebnis zurück
Ich möchte die Zeit analysieren:
Ohne Zeitzone.
Ohne den Konstruktor Date.UTC oder ein neues Datum (Jahr, Monat, Tag) aufzurufen.
Einfache Übergabe eines Strings an den Date-Konstruktor (ohne Prototyp-Ansätze).
Ich muss Produktobjekt
Date
nichtString
.
Date.parse
BTW einfach weglassen und die Zeichenfolge direkt an denDate
Konstruktor übergeben.Date
Objekt kopieren , um das richtige Objekt zum Vergleichen der Daten in MongoDB zu erhalten:new Date(dateStart.getFullYear(), dateStart.getMonth(), dateStart.getDate())
Antworten:
Das Datum wird korrekt analysiert. Nur toString konvertiert es in Ihre lokale Zeitzone:
Javascript Date-Objekte sind Zeitstempel - sie enthalten lediglich eine Anzahl von Millisekunden seit der Epoche. In einem Datumsobjekt gibt es keine Zeitzoneninformationen. 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 korrekt analysiert wird - das heißt, es enthält tatsächlich eine Anzahl von Millisekunden, die "2005-07-08T11: 22: 33" in GMT entsprechen.
quelle
new Date(Date.parse("2005-07-08T11:22:33+0000"))
und das Datum über den Konstruktor kopiert :new Date(dateStart.getFullYear(), dateStart.getMonth(), dateStart.getDate())
. Beide Lösungen, unterschiedliche Ergebnisse, zweitens richtig! Ihre Antwort war nützlich und wurde gerade in hunlock.com/blogs/Javascript_Dates-The_Complete_Reference erwähnt . Oben.Ich habe das gleiche Problem. Ich erhalte ein Datum als Zeichenfolge, zum Beispiel: '2016-08-25T00: 00: 00', aber ich muss ein Date-Objekt mit der richtigen Zeit haben. Um String in Objekt zu konvertieren, verwende ich getTimezoneOffset:
getTimezoneOffset()
gibt einen negativen oder positiven Ätherwert zurück. Dies muss abgezogen werden, um an jedem Ort der Welt zu funktionieren.quelle
var userTimezoneOffset = date.getTimezoneOffset()*60000;
getTimezoneOffset()
Gibt die Anzahl der Minuten in die entgegengesetzte Richtung zurück, die Sie denken würden - meine Zeitzone ist momentan UTC-4,getTimezoneOffset()
gibt aber eine positive 240 zurück. DaheruserTimezoneOffset
sollte von abgezogendate.getTime()
und nicht addiert werden.new Date('2016-08-25T00:00:00Z')
ich denke, der Punkt war zu manipulieren,new Date('2016-08-25T00:00:00Z')
so dass die Ortszeit mit der Zeit 0:00 angezeigt wird, aber dieser Code fehlteZ
Ich stieß auf dasselbe Problem und erinnerte mich dann an etwas Wackeliges an einem Legacy-Projekt, an dem ich arbeitete, und daran, wie sie mit diesem Problem umgingen. Ich habe es damals nicht verstanden und es war mir egal, bis ich selbst auf das Problem stieß
Aus irgendeinem Grund setzt das Übergeben des Datums als '01 -02-2014 'die Zeitzone auf Null und ignoriert die Zeitzone des Benutzers. Dies mag ein Zufall in der Date-Klasse sein, aber es existierte vor einiger Zeit und existiert heute. Und es scheint browserübergreifend zu funktionieren. Probieren Sie es aus.
Dieser Code wird in einem globalen Projekt implementiert, in dem Zeitzonen eine große Rolle spielen, die Person, die das Datum betrachtet, sich jedoch nicht um den genauen Zeitpunkt der Einführung kümmerte.
quelle
2014/5/31
und2014/05/31
als Sa 31. Mai 2014 00:00:00 GMT-0600 (Mountain Daylight Time) `(MDT ist meine aktuelle Zeitzone). Mit Bindestrichen ... werden alle Browser2014-05-31
als Fr 30 Mai 2014 18:00:00 GMT-0600 (Mountain Daylight Time) interpretiert . Seltsamerweise gibt2014-5-31
Chrome mit Samstag zurück, Firefox gibt Freitag zurück und IE11 sagt, dass das Datum ungültig ist. Scheint, als würde eindate.replace('-','/')
Trick den Trick machen.Das
Date
Objekt selbst enthält ohnehin eine Zeitzone, und das zurückgegebene Ergebnis ist der Effekt, dass es standardmäßig in einen String konvertiert wird. Das heißt, Sie können kein Datumsobjekt ohne Zeitzone erstellen . Sie können jedoch das Verhalten einesDate
Objekts nachahmen, indem Sie ein eigenes erstellen. Dies ist jedoch besser an Bibliotheken wie moment.js zu übergeben .quelle
einfache Lösung
quelle
Das Datum in Javascript hält es einfach im Inneren. Daher werden die Datums- und Uhrzeitdaten in der UTC-Unix-Epoche (Millisekunden oder ms) gespeichert.
Wenn Sie eine "feste" Zeit haben möchten, die sich in der Zeitzone auf der Erde nicht ändert, können Sie die Zeit in UTC an Ihre aktuelle lokale Zeitzone anpassen und speichern. Und wenn Sie es erneut abrufen, wird in jeder lokalen Zeitzone, in der Sie sich befinden, die angepasste UTC-Zeit basierend auf der Person angezeigt, die es gespeichert hat, und der lokale Zeitzonenversatz hinzugefügt, um die "feste" Zeit zu erhalten.
Datum speichern (in ms)
Datum abrufen / anzeigen (in ms)
Dann kannst du:
quelle
Sie können diesen Code verwenden
quelle
Da es sich bei der Anzeige des Datums wirklich um ein Formatierungsproblem handelt (z. B. Anzeige in Ortszeit), verwende ich gerne das neue (ish) Intl.DateTimeFormat- Objekt, um die Formatierung durchzuführen, da sie expliziter ist und mehr Ausgabeoptionen bietet:
Wie gezeigt, werden durch Setzen der Zeitzone auf 'UTC' keine lokalen Konvertierungen durchgeführt. Als Bonus können Sie damit auch poliertere Ausgaben erstellen. Weitere Informationen zum Intl.DateTimeFormat- Objekt finden Sie in Mozilla - Intl.DateTimeFormat .
Bearbeiten:
Die gleiche Funktionalität kann erreicht werden, ohne ein neues
Intl.DateTimeFormat
Objekt zu erstellen . Übergeben Sie einfach die Optionen für Gebietsschema und Datum direkt an dietoLocaleDateString()
Funktion.quelle
Nur eine allgemeine Anmerkung. eine Möglichkeit, es flexibel zu halten.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
Wir können getMinutes () verwenden, aber in den ersten 9 Minuten wird nur eine Zahl zurückgegeben.
quelle
(new Date().toString()).replace(/ \w+-\d+ \(.*\)$/,"")
Dies wird ausgegeben: Di Jul 10 2018 19:07:11
(new Date("2005-07-08T11:22:33+0000").toString()).replace(/ \w+-\d+ \(.*\)$/,"")
Dies wird ausgegeben: Fri Jul 08 2005 04:22:33
Hinweis: Die zurückgegebene Zeit hängt von Ihrer lokalen Zeitzone ab
quelle
Dies ist die Lösung, die ich für dieses Problem gefunden habe, das für mich funktioniert.
verwendete Bibliothek: momentjs mit einfacher Javascript-Datumsklasse.
Schritt 1. Konvertieren Sie das String-Datum in ein Moment-Objekt (PS: Moment behält das ursprüngliche Datum und die ursprüngliche Uhrzeit bei, solange die
toDate()
Methode nicht aufgerufen wird):const dateMoment = moment("2005-07-08T11:22:33+0000");
Schritt 2. Extrahieren
hours
undminutes
Werte aus dem zuvor erstellten Momentobjekt:Schritt 3. Moment in Datum konvertieren (PS: Dadurch wird das ursprüngliche Datum basierend auf der Zeitzone Ihres Browsers / Computers geändert. Machen Sie sich jedoch keine Sorgen und lesen Sie Schritt 4.):
Schritt 4. Stellen Sie die in Schritt 2 extrahierten Stunden und Minuten manuell ein.
In Schritt 5
dateObj
wird nun das ursprüngliche Datum ohne Zeitzonenunterschied angezeigt. Selbst die Änderungen der Sommerzeit haben keine Auswirkungen auf das Datumsobjekt, da wir die ursprünglichen Stunden und Minuten manuell einstellen.Hoffe das hilft.
quelle
Es gibt einige inhärente Probleme bei der Datumsanalyse, die leider standardmäßig nicht gut behoben werden.
- Von Menschen lesbare Daten enthalten implizite Zeitzonen -
Es gibt viele weit verbreitete Datumsformate im Internet, die nicht eindeutig sind
Um diese Probleme einfach und sauber zu lösen, würde man eine Funktion wie diese benötigen:
Ich habe danach gesucht, aber nichts dergleichen gefunden!
Also habe ich erstellt: https://github.com/zsoltszabo/timestamp-grabber
Genießen!
quelle