hmm: Angular8 UTC Datum als UTC erkennen

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.

akzeptierte Antworten

  1. Hallo,

    gibt es Angular keine UTC-Methoden?

    Gruß
    Jürgen

    1. 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

      1. Hallo,

        hast du mal Date.UTC ausprobiert?

        Gruß
        Jürgen

      2. 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

  2. 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

    --
    Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
    Hohle Köpfe von Terry Pratchett
    1. 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?

      1. 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);
        
        1. ne irgendwie funktioniert das nicht...

      2. 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

        --
        Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
        Hohle Köpfe von Terry Pratchett
      3. @@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 🖖

        --
        „Man kann sich halt nicht sicher sein“, sagt der Mann auf der Straße, „dass in einer Gruppe Flüchtlinge nicht auch Arschlöcher sind.“
        „Stimmt wohl“, sagt das Känguru, „aber immerhin kann man sich sicher sein, dass in einer Gruppe Rassisten nur Arschlöcher sind.“

        —Marc-Uwe Kling
  3. 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.

  4. 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);
      }
    
    1. 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

      --
      Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
      Hohle Köpfe von Terry Pratchett
    2. @@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 🖖

      --
      „Man kann sich halt nicht sicher sein“, sagt der Mann auf der Straße, „dass in einer Gruppe Flüchtlinge nicht auch Arschlöcher sind.“
      „Stimmt wohl“, sagt das Känguru, „aber immerhin kann man sich sicher sein, dass in einer Gruppe Rassisten nur Arschlöcher sind.“

      —Marc-Uwe Kling
    3. Hallo,

      was ist mit den UTC-Methoden? Sind die für deinem Fall nicht geeignet?

      Gruß
      Jürgen

    4. 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.