Angular8 UTC Datum als UTC erkennen
![](/uploads/default_avatar/thumb/missing.png)
- javascript
- zeit & datum
0 JürgenB
- angular
1 Auge
- angular
- javascript
0 hmm
0 dedlfix
-1 hmm
0 Auge
0 Gunnar Bittersmann
0 JürgenB
0 hmm
Hi,
in meiner App werden Zeiten in UTC eingegeben.
Zu dieser Zeit müsste ich eine Stunde dazu addieren und dann die Millisecunden ab 1970 berechnen.
Wie mache ich das in Angilar?
Mein Problem ist, dass der eingegebene String bei new Date(string) als MEZ interpretiert wird.
Hallo,
gibt es Angular keine UTC-Methoden?
Gruß
Jürgen
Leider konnte ich keine passende finden die aus einem String einen UTC String macht.
mein aktueller versuch ist:
validDate(calendar, stunde) {
var eingabeUtc = new Date(this.calendar);
eingabeUtc.setHours(stunde);
var heute = new Date();
heute.setHours(heute.getHours() + 1);
var heuteUtcNr = Date.parse(heute.toUTCString());
var eingabeNr = Date.parse(eingabeUtc.toLocaleString());
console.log(heute.toUTCString() + " < " + eingabeUtc.toLocaleString());
return (heuteUtcNr < eingabeNr);
}
output ist zb: Tue, 04 Feb 2020 09:20:33 GMT < 4.2.2020, 7:00:00
Was leider als true angezeigt wird, ich vermute wegen dem GMT in Date.parse
Hallo nochmal,
die Methode toLocaleString hat noch zwei Übergabeparameter. Das kann dann auch so aussehen:
toLocaleString('en-EN',{timeZone:'UTC'});
toLocaleString('de-DE');
...
Gruß
Jürgen
Hallo
in meiner App werden Zeiten in UTC eingegeben.
Zu dieser Zeit müsste ich eine Stunde dazu addieren und dann die Millisecunden ab 1970 berechnen.
Mal abgesehen vom Umrechnungsgedöns liegt hier mutmaßlich ein Logikfehler vor. Mit „Millisecunden ab 1970“ ist der Unix-Timestamp, wie in JavaScript üblich, in Millisekunden gemeint? Wenn ja, dann ist dieser Wert von sich aus UTC-/GMT-basiert. Eine Umrechnung einer UTC-basierten Zeit in die MEZ (+1 Stunde) [^1] und eine nachfolgende Umrechnung in den Timestamp, so, wie du sie selbst beschreibst, ist somit unnötig.
Tschö, Auge
wenn ich eine eingabe habe die als UTC gemeint ist zb 01.01.2000 10:00 Uhr
und diese leider als MEZ String gespeichert wird. Dann habe ich das problem, dass mit 1-2 Stunden fehlen oder? Wie kann ich das ändern?
das hier ist immernoch eine stunde zuviel:
var eingabeUtc = new Date("04.02.2020");
eingabeUtc.setHours("11");
var heute = new Date();
heute.setHours(heute.getHours() + 1);
heute.setMinutes(0);
heute.setSeconds(0);
var heuteUtcNr = Date.parse(heute.toUTCString());
var eingabeNr = Date.parse(eingabeUtc.toLocaleString());
console.log(heute + " < " + eingabeUtc.toLocaleString());
console.log(heuteUtcNr + " <= " + eingabeNr);
console.log(heuteUtcNr <= eingabeNr);
ne irgendwie funktioniert das nicht...
Hallo
wenn ich eine eingabe habe die als UTC gemeint ist zb 01.01.2000 10:00 Uhr und diese leider als MEZ String gespeichert wird. Dann habe ich das problem, dass mit 1-2 Stunden fehlen oder?
Ja, das ist so. Aber davon war bisher nicht die Rede.
Du schriebst im Eröffnungsposting:
„in meiner App werden Zeiten in UTC eingegeben.“
Demnach bin ich davon ausgegangen, dass diese Werte auch so (als UTC) gespeichert werden.
Fakt ist jedenfalls, dass der Unix-Timestamp, auch wenn es sich um die in JS übliche Entsprechung in Millisekunden handelt, die Zeit seit dem 01.01.1970 00:00:00 UTC hochzählt. Nicht in MEZ oder irgendeiner anderen Zeitzone. Deine Beschreibung, einen UTC-Wert in MEZ umzurechnen, um daraus den Zeitstempel abzuleiten, ist jedenfalls mindestens irreführend.
Tschö, Auge
@@hmm
wenn ich eine eingabe habe die als UTC gemeint ist zb 01.01.2000 10:00 Uhr
Mit „Eingabe“ meinst du Eingabefelder für Datum und Uhrzeit?
und diese leider als MEZ String gespeichert wird.
Ja, new Date('2020-02-04 11:00')
wertet die Zeit in lokaler Zeitzone, bei Locale mit MEZ kommt in UTC 2020-02-04T10:00Z heraus.
☞ erstes und zweites Formular im Pen
Dann habe ich das problem, dass mit 1-2 Stunden fehlen oder? Wie kann ich das ändern?
Indem du sofort bei der Eingabe die Uhrzeit schon als UTC wertest. Wie Jürgen schon sagte, ist Date.UTC()
dabei hilfreich.
☞ drittes Formular im Pen
LLAP 🖖
Tach!
Wie mache ich das in Angilar?
Angular hat mit Zeitberechnungen nichts am Hut. Das musst du mit dem Date-Objekt von Javascript tun, das ist dafür ausreichend. Angular kommt erst dann wieder ins Spiel, wenn du ein Datum ausgeben möchtest, und dafür die DatePipe verwendest.
dedlfix.
danke, ich bin jetzt so durchgekommen:
validDate(calendar, stunde, minute) {
var eingabe = new Date(this.calendar);
eingabe.setHours(stunde);
eingabe.setMinutes(minute);
var heute = new Date();
heute.setHours(heute.getHours() + 1);
heute.setMinutes(0);
heute.setSeconds(0);
var heuteUtcNr = Date.parse(heute.toUTCString());
var eingabeNr = Date.parse(eingabe.toUTCString());
return (heuteUtcNr <= eingabeNr);
}
Hallo
danke, ich bin jetzt so durchgekommen:
validDate(calendar, stunde, minute) { var eingabe = new Date(this.calendar); eingabe.setHours(stunde); eingabe.setMinutes(minute); var heute = new Date(); heute.setHours(heute.getHours() + 1); heute.setMinutes(0); heute.setSeconds(0); var heuteUtcNr = Date.parse(heute.toUTCString()); var eingabeNr = Date.parse(eingabe.toUTCString()); return (heuteUtcNr <= eingabeNr); }
Du erstellst eine UTC-Zeitangabe, addierst eine Stunde und wandelst diese Angabe wieder in eine UTC-Zeitangabe um? Kommt mir komisch vor. Zudem, während der Laufzeit der Sommerzeit änderst du die Funktion in heute.setHours(heute.getHours() + 2);
?
Tschö, Auge
@@hmm
danke, ich bin jetzt so durchgekommen:
Mit Betonung auf „jetzt“‽
heute.setHours(heute.getHours() + 1);
Und ab Ende März funktioniert der Kram nicht mehr und du fragst wieder hier im Forum nach, was du denn falsch gemacht hast?
LLAP 🖖
Hallo,
was ist mit den UTC-Methoden? Sind die für deinem Fall nicht geeignet?
Gruß
Jürgen
hatte ich oben angesprochen:
das gehtHours + 1 hat nichts mit UTC zutun. Da geht und darum, dass kein Wert eingebenen werden soll, der größer ist als die aktuelle Uhrzeit auf Stunden aufgerundet.