Weisen Sie Javascript-Datum der html5 datetime-local-Eingabe zu
Lesezeit: 4 Minuten
DOM:
<input id="myTextbox" type="datetime-local" />
Javascript (jQuery):
$('#myTextbox').val(new Date().toISOString());
Funktioniert nicht. Das Format der Eingabe[type=datetime-local] soll ISO 8601 sein, was Date.toISOString() von Javascript zurückgibt.
Leider haben die vorherigen Antworten für mich nicht richtig funktioniert, da sie vorschlagen, die UTC-Zeit als meine Ortszeit zu betrachten (was im Allgemeinen falsch ist).
Zum Beispiel, wenn meine Ortszeit ist 2021-03-10T01:50:55+0200Dann date.toISOString() kehrt zurück 2021-03-09T23:50:55Zalso kann ich nicht einfach schneiden Z am Ende, denn für datetime-local Ich brauche lokale Datetime 2021-03-10T01:50:55NICHT 2021-03-09T23:50:55.
Der feste Code wäre also folgender:
const d = new Date();
const dateTimeLocalValue = (new Date(d.getTime() - d.getTimezoneOffset() * 60000).toISOString()).slice(0, -1);
$('#myTextbox').val(dateTimeLocalValue);
Deshalb funktioniert es: Wir verwenden immer noch den Trick, das abschließende “Z” aus dem UTC-Zeitformat zu entfernen, aber bevor wir dies tun, verschieben wir die Zeit um unseren Zeitzonen-Offset (Rückgabe um date.getTimezoneOffset() in Minuten) in Rückwärtsrichtung. Danach liefert die verschobene Zeit, konvertiert in UTC, dasselbe Datum und dieselbe Uhrzeit wie unsere lokale. Tatsächlich ist die verschobene Zeit natürlich ein anderer Moment, aber es ist uns egal, sobald das Datum und die Uhrzeit in UTC mit unserem Datum und der Uhrzeit in der lokalen Zeitzone übereinstimmen.
Mit dem obigen Beispiel funktioniert es folgendermaßen:
lokale Zeit um Zeitzonen-Offset in die entgegengesetzte Richtung verschieben (z. B. wenn es UTC + 2 war, dann machen wir noch weiter von UTC): 2021-03-10T01:50:55+0200 -> 2021-03-10T03:50:55+0200 (von - date.getTimezoneOffset() * 60000weil 1 Minute 60000 Millisekunden sind)
Rückgabe von Datums- und Zeitwerten durch Konvertierung in UTC: 2021-03-10T03:50:55+0200 -> 2021-03-10T01:50:55Z (von .toISOString())
nachlaufend entfernen Z um echte Ortszeit mit dem geeigneten Format zu erhalten <input type="datetime-local"> (von .slice(0, -1))
Wenn jemand eine Rücktransformation benötigt, vom Eingabewert zum js-Datum, müssen wir nur die gleichen Schritte in umgekehrter Reihenfolge ausführen:
const dateTimeLocalValue = $('#myTextbox').val();
const fakeUtcTime = new Date(`${dateTimeLocalValue}Z`);
const d = new Date(fakeUtcTime.getTime() + fakeUtcTime.getTimezoneOffset() * 60000);
console.log(d);
Fragen sind willkommen)
Hier ist ein kleiner Helfer, den ich mit Ihrem Code erstellt habe const getDateString = (date?: Date) => {const newDate = date ? new Date(date) : new Date();return new Date(newDate.getTime() - newDate.getTimezoneOffset() * 60000).toISOString().slice(0, -1);};
– sidonaldson
25. Mai 2021 um 11:14 Uhr
Alexander Taylor
Aktualisieren: Diese Antwort kann das Datum basierend auf Ihrer lokalen Zeitzone und Tageszeit falsch einstellen (um einen Tag abweichen). Eine Erklärung und eine korrekte Lösung finden Sie in der Antwort von Maxim.
Die Methode toISOString() wandelt ein Date-Objekt unter Verwendung des ISO-Standards in einen String um.
Der Standard heißt ISO-8601 und das Format ist: YYYY-MM-DDTHH:mm:ss.sssZ
Während ISO 8601 eine gewisse Flexibilität bietet, ist das Format von javascript’s Date’s toISOString() genau wie oben gezeigt.
Das „Z“ am Ende bedeutet, dass es sich um ein UTC-Datum handelt. Diese Darstellung enthält also Zeitzoneninformationen. (Javascript-Daten sind natürlich in UTC-Zeit, da sie intern als Millisekunden seit der Epoche dargestellt werden.)
Das Format der HTML5-Eingabe mit type=datetime-local muss …
Die folgenden Teile, in genau der folgenden Reihenfolge:
Dies ist immer noch ISO 8601, aber strenger und erlaubt keine Angabe einer Zeitzone.
Glücklicherweise ist das Entfernen der Zeitzone so einfach wie das Entfernen des nachgestellten „Z“.
var isoStr = new Date().toISOString();
$('#myTextbox').val(isoStr.substring(0,isoStr.length-1));
Die Antwort von int32_t wurde positiv bewertet, aber ich verwende dies aus Gründen der Kompatibilität mit Firefox, das datetime-local nicht unterstützt.
– Alexander Taylor
5. März 2015 um 11:56 Uhr
Wow, ich habe viel zu lange nach dieser einfachen Lösung gesucht. Dies sollte die akzeptierte Antwort sein.
– R10t–
2. Dezember 2019 um 19:37 Uhr
Beachten Sie, dass new Date().toISOString() ändert den Zeitstempel entsprechend auf die aktuelle Zeitzone, die möglicherweise ebenfalls angepasst werden muss
– phil294
8. Juli 2020 um 18:53 Uhr
Diese Antwort geht davon aus, dass meine lokale Zeitzone UTC ist und für keine andere Zeitzone funktioniert. Es ist einfach falsch, sorry. Die richtige Antwort finden Sie in der Antwort stackoverflow.com/a/66558369/2988107 von Maxim.