Casalblanca: Konvertierung von JSON-Date

Hallo Forum,

ich habe da einen sehr seltsamen Effekt, den ich nicht ganz verstehn kann. Ich habe ein Datum in JSon-Format. Ich convertiere dieses via javascript in ein normales Date-Time:

var date = new Date(parseInt(MyDate.substr(6)));

Bis dahin ist auch alles OK. Das Problem ist die Zeitzone des Rechners. Wie die auf Berlin steht, bekomme ich das korrekte Datum (Juli), nicht aber wenn diese auf London steht. Da bekomme ich ein falsches Datum (Juni). Hat da jemand eine Idee?

Danke im Voraus

  1. Hallo,

    du kannst mit dem UTC-Datum rechnen, musst dann aber evtl. auf das lokale Datum, das vom Ort, von der Jahreszeit und der Rechnereinstellung abhängt-

    Gruß Jürgen

  2. Tach!

    Das Problem ist die Zeitzone des Rechners. Wie die auf Berlin steht, bekomme ich das korrekte Datum (Juli), nicht aber wenn diese auf London steht. Da bekomme ich ein falsches Datum (Juni). Hat da jemand eine Idee?

    Ja, zeitzonenunabhängige Funktionen verwenden. Date hat auch UTC-Methoden an Bord.

    dedlfix.

  3. Ich habe ein Datum in JSon-Format.

    JSON hat kein Datumsformat. Du kannst entweder das Datum als Text übermitteln oder als Zahl.

    Ich convertiere dieses via javascript in ein normales Date-Time:

    var date = new Date(parseInt(MyDate.substr(6)));

    Da du parseInt() benutzt, handelt es sich wohl du das, was landläufig als Unix-Zeit bezeichnet wird, die Anzahl der Sekunden seit dem 1.1.1970, 0 Uhr UTC.

    Bis dahin ist auch alles OK. Das Problem ist die Zeitzone des Rechners. Wie die auf Berlin steht, bekomme ich das korrekte Datum (Juli), nicht aber wenn diese auf London steht. Da bekomme ich ein falsches Datum (Juni). Hat da jemand eine Idee?

    Bei der Umwandlung zwischen Unix-Zeit und lokaler Zeit (beachte: du hast zwei Umwandlungen!) vergisst du möglicherweise die Zeitzone anzugeben. Der Unterschied beträgt zwar derzeit zwei Stunden, erklärt aber nicht, warum du auch am heutigen Mittag noch einen falschen Monat bekommst.

    Wie üblich: Zeige den Code, die Daten, die reinkommen und das, was rauskommt. Ansonsten bekommst du hier nur Stochern im Nebel.

    1. Hallo,

      danke für die Antwort. Ich hole die Daten aus der Datenbank (C#), die ich dann via JsonResult/Callback an die aufrufende ajax-Methode zurücksende. Das Datum kommt da so an "Date(1435701600000)". Diese wandle ich in "JavaScricts-Raum", wie vorhin geschildert, in Date-Time um. Das Datum, das ich habe ist in Form von z.B. "2013-02-27 18:02:49.000".

      Ich hole momentan z.B. das Datum "2015-07-... 00:00:00.000" aus der Datenbank. Nach der Umwandlung in Londoner Zeit bekomme ich aber "2015-06-30 00:00:00.000" zurück, obwohl in Deutscher Zeit alles in Ordnung ist.

      Wie sieht die Umwandlung in Unix-Zeit aus? Hier geht es um eine Web-Anwendung. Wie kommt man da an die Zeitzone des Benutzers daran? Hast du eventuell ein Beispiel?

      Gruß

      1. Hallo,

        ... Diese wandle ich in "JavaScricts-Raum", wie vorhin geschildert, in Date-Time um. Das Datum, das ich habe ist in Form von z.B. "2013-02-27 18:02:49.000".

        wie machst du das?

        Wie sieht die Umwandlung in Unix-Zeit aus? Hier geht es um eine Web-Anwendung. Wie kommt man da an die Zeitzone des Benutzers daran? Hast du eventuell ein Beispiel?

        kennst du das Date-Objekt?

        Für beliebige Datumszonenumrechnungen verwende ich die Google Time Zone API .

        Gruß Jürgen

        1. Hallo Jürgen,

          wie machst du das?

          wie meinstdu das? Meinst du das hier?

          Var datum = new Date(parseInt(MyDate.substr(6)));
          

          Für beliebige Datumszonenumrechnungen verwende ich die Google Time Zone API .

          Das ist aber viel Aufwand für eine reine Umwandlung. So hat man nun die Zeitzone. Wie kann man dann das Datum mit Javascript richtig umwandeln?

          Ich stehe momentan total unter Strom. Gibt es da einen einfacheren Weg oder ein Beispiel, wie man vorzugehen hat?

          Gruß

          1. Hallo

            wie meinstdu das? Meinst du das hier?

            Var datum = new Date(parseInt(MyDate.substr(6)));
            

            ja. Hast du hier schon mal die UTC-Version ausprobiert?

            Für beliebige Datumszonenumrechnungen verwende ich die Google Time Zone API .

            Das ist aber viel Aufwand für eine reine Umwandlung. So hat man nun die Zeitzone. Wie kann man dann das Datum mit Javascript richtig umwandeln?

            mit genau dieser Information und den date-Methoden.

            Jetzt muss ich noch mal nachfragen wo dein Problem liegt. Du liest ein Datum ein. Das Datum hat jemand in London (oder irgendwo auf der Welt) eingegeben. Dann verarbeitest du das Datum mit den Zeiteinstellungen deines Rechners. Ist das so?

            Gruß Jürgen

      2. Hallo

        Ich hole momentan z.B. das Datum "2015-07-... 00:00:00.000" aus der Datenbank. Nach der Umwandlung in Londoner Zeit bekomme ich aber "2015-06-30 00:00:00.000" zurück, obwohl in Deutscher Zeit alles in Ordnung ist.

        Hast du, wie deine Beispiele "2015-06-30 00:00:00.000" implizieren, tatsächlich keine Uhrzeitangabe in deinen Daten? Zumindest bis "2015-07-01 00:59:59.999" (MESZ) trifft zu, dass dies sowohl laut Londoner Lokalzeit, in GMT/UTC sogar bis 01:59:59:999 nach der 30.06.2015 (spät abends) ist. Die Unterscheidung mache ich hier explizit, weil GMT/UTC feststehend ist, die Lokalzeit in London hingegen – wie die mitteleuropäische auch – zwischen Normal- und Sommerzeit unterscheidet.

        Wie sieht die Umwandlung in Unix-Zeit aus? Hier geht es um eine Web-Anwendung. Wie kommt man da an die Zeitzone des Benutzers daran? Hast du eventuell ein Beispiel?

        Mit getTimezoneOffset ermittelst du zwar nicht explizit die Zeitzone, aber den Unterschied der Zeitzone zu GMT/UTC, wie sie auf dem Rechner des Benutzers angegeben ist. Grundsätzlich ist es sinnvoll, mit dem Date-Objekt zu arbeiten, da dessen Methoden die meisten möglichen Fälle abdecken.

        Tschö, Auge

        --
        Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
        Terry Pratchett, „Gevatter Tod“
        1. Hi,

          danke. Meine Daten habe Uhrzeitangabe. Ich habe die aber in meinem Beispiel weggelassen. Ich benutzt bereits das Date-Objekt, um den Monat uns das Jahr zu ermitteln.

          date.getFullYear()
          date.getMonth()
          

          Ich bekome aber trotzdem die falschen Monate angezeigt. Mit getTimezoneOffset habe ich zwar einen Unterschied zwischen -1 und -2, ich weiß aber nicht ob man generel darauf aufbauen kann.

          Gruß

          1. Hallo

            date.getFullYear()
            date.getMonth()
            

            Ich bekome aber trotzdem die falschen Monate angezeigt.

            Achtung: JavaScript beginnt die Monatszählung bei 0, nicht bei 1. Du musst also immer 1 zum Monat hinzuaddieren.

            Mit getTimezoneOffset habe ich zwar einen Unterschied zwischen -1 und -2, ich weiß aber nicht ob man generel darauf aufbauen kann.

            Wir haben ja mittlerweile den 2. Juli. Wie sehen denn die Ausgaben der lokalen Zeit und GMT/UTC mit dem aktuellen Datum aus?

            Tschö, Auge

            --
            Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
            Terry Pratchett, „Gevatter Tod“
            1. Hallo,

              um die Werte der unterschiedlichen Time-Zone zu testen, stelle ich meine lokale Zeitezonen manuel um. Wie es bei anderen Daten der Fall ist, sollte dies um einen Monat zurückliegen, angefangen bei 0, wäre es 5.

              Die Daten werden von der Datenbank korrekt zum Javascript übertragen, solbald ich dies aber mit der londonen Zeitzone in Datum umwandele, wird der Monat verfälscht:

              var date = new Date(parseInt(MyDate.substr(6)));    <---
              var month = date.getMonth() + 1;
              

              Ich weiß echt nicht, was da schiefläuf. Ich habe das Ganze auch mit UTCDate versucht, leider kein erfolg.

              Gruß

              1. um die Werte der unterschiedlichen Time-Zone zu testen, stelle ich meine lokale Zeitezonen manuell um.

                Die Daten werden von der Datenbank korrekt zum Javascript übertragen

                Woher weisst das? So weit ich dich verstanden habe, gibt dein C#-Code die Zeit als Text in der Form "Date(1435701600000)" aus.

                Diese Zahl stellt die Unix-Zeit dar, umgerechnet den 1. Juli 2015, 0 Uhr Berliner Zeit.

                In deiner Datenbank hast du Zeiten im Format "2013-07-01 00:00:00.000" - ich sehe da keine Zeitzone! Das bedeutet, wenn du an deinem Datenbank-Rechner die Zeitzone umstellst, dann gibt er dir eine andere Unix-Zeit aus, weil er sich zwangsläufig bei deiner zonenlosen Datenbank-Zeit eine Zeitzone dazudenken muss, um auf die Zeitzonen-behaftete Unix-Zeit zu kommen.

                Arbeitest du nur mit Zeiten um Mitternacht herum, bekommst du dann auch das falsche Datum.

                Noch nicht verstanden habe ich, ob du nur mit solchen Zeiten um Mitternacht und den Monatswechsel herum testest oder ob das Problem auch tagsüber bzw. monatsmittig, zum Beispiel bei "2013-02-17 18:02:49.000" auftritt. In letzterem Fall ist die Ursache woanders.

                Ich weiß echt nicht, was da schiefläuf. Ich habe das Ganze auch mit UTCDate versucht, leider kein erfolg.

                Das oben genannte Problem hat seine Ursache nicht auf Seiten Javascripts. Die Unix-Zeit hat eine Zeitzoneninformation, die Javascript-Funktionen wandeln sie ebenfalls in eine Angabe mit Zeitzone um, wahlweise in die örtliche Zeit oder in UTC.

                Die Zeitzone fehlt in deiner Datenbank und folgend bei der Umwandlung aus der Datenbank heraus, also in deinem C#-Code.

                Du hast noch keinen vollständigen Code mit Eingabe und Ausgabe gezeigt, nur aus dem Zusammenhang gerissene Stücke. Zeige doch bitte mal zwei, drei vollständige Datenbeispiele en bloc:

                1. Was steht in der Datenbank? Welche Zeitzone ist an diesem Rechner eingestellt?
                2. Was wird für 1. als JSON-Daten ausgegeben? Welche Zeitzone ist an diesem Rechner eingestellt?
                3. Welches Datum landet für 2. im Javascript-Date-Objekt? Welche Zeitzone ist an diesem Rechner eingestellt?
                1. Hi,

                  vielen Dank.:

                  1. Was steht in der Datenbank? Welche Zeitzone ist an diesem Rechner eingestellt?

                  n der Datenbak stehen Datumsangaben in DateTime-Format "2013-02-27 18:02:49.000". Der Datenbank läuft auf einem Server mit Berliner Zeitzone.

                  1. Was wird für 1. als JSON-Daten ausgegeben? Welche Zeitzone ist an diesem Rechner eingestellt?

                  Was emist du damit? Wie bereits erwähnt, schickt der C# Code sowas wie unten zur aufrufenden ajax-Methode:

                              return new JsonResult
                              {
                                  Data = values,
                                  MaxJsonLength = Int32.MaxValue
                              };
                  

                  In values steht u.a. auch das Feld Date. Der Rechner, auf dem der die Webanwendung läuft, steht bei uns in der Firma mir Berliner-Zeitzone.

                  1. Welches Datum landet für 2. im Javascript-Date-Objekt? Welche Zeitzone ist an diesem Rechner eingestellt?

                  Das verstehe auch nicht ganz. Das Datum ist ja in Unix-Format, was du auch selber oben angegeben hast. Der Zielrechner befindet sich in London mit der dortigen Zeitzone.

                  Gruß

                  1. > > 3. Welches Datum landet für 2. im Javascript-Date-Objekt? Welche Zeitzone ist an diesem Rechner eingestellt?

                    Das verstehe auch nicht ganz. Das Datum ist ja in Unix-Format, was du auch selber oben angegeben hast.

                    Nein, du hast insgesamt drei Formate: Das Datenbankformat (ohne Zeitzone), die Unix-Zeit im JSON-Paket (mit "eingebauter", fester Zeitzone) und das Javascript-Date-Objekt (mit wählbarer Zeitzone).

                    Wie dem auch sei, ohne vollständigen Datenverlauf kann keiner nachvollziehen, was da bei dir wo passiert.

                    Zeige doch bitte mal zwei, drei vollständige Datenbeispiele en bloc:

                    1. Was steht in der Datenbank? Welche Zeitzone ist an diesem Rechner eingestellt?
                    2. Was wird für 1. als JSON-Daten ausgegeben? Welche Zeitzone ist an diesem Rechner eingestellt?
                    3. Welches Datum landet für 2. im Javascript-Date-Objekt? Welche Zeitzone ist an diesem Rechner eingestellt?

                    So in etwa hatte ich mir das erhofft:

                    Datenbank: 2015-07-02 16:47:15
                    Umwandlung in Berlin nach: Unix: 1435848435731
                    Umwandlung in Berlin nach: Javascript: Date {Thu Jul 02 2015 16:47:15 GMT+0200 (CEST)}

                    2015-01-01 00:00:00
                    In Berlin nach: 1420066800000
                    In Berlin nach: Date {Thu Jan 01 2015 00:00:00 GMT+0100 (CET)}

                    2015-01-01 00:00:00
                    In London nach: 1420070400000
                    In Berlin nach: Date {Thu Jan 01 2015 01:00:00 GMT+0100 (CET)}

                    Beachte den Stundenhüpfer zwischen Beispiel 2 und 3. Aus demselben Datenbankdatum werden zwei unterschiedliche Ergebnisse, je nach eingestellter Zeitzone auf dem Rechner, der das Datenbankdatum in Unix-Zeit umwandelt.

                    Zum letzten, dritten Male: Wenn du so eine Liste mit deinen Daten hättest, könnte dir auch weitergeholfen werden. Ansonsten wird das nix.

                2. Hallo

                  Nur zur Klarstellung:

                  In deiner Datenbank hast du Zeiten im Format "2013-07-01 00:00:00.000" - ich sehe da keine Zeitzone! Das bedeutet, wenn du an deinem Datenbank-Rechner die Zeitzone umstellst, dann gibt er dir eine andere Unix-Zeit aus, weil er sich zwangsläufig bei deiner zonenlosen Datenbank-Zeit eine Zeitzone dazudenken muss, um auf die Zeitzonen-behaftete Unix-Zeit zu kommen.

                  Das Datenbankserverprogramm nimmt normalerweise die auf dem Server (Gerät) geltende Systemzeitzone, um anhand des hier gezeigten zeitzonenlosen Datums die Unix-Zeit zu ermitteln. Ich vermute hier eher die Nichtbeachtung dieses Umstands bei der Weiterverarbeitung der Daten.

                  Konsequent ist an dieser Stelle, Zeitangaben mit UTC zu speichern, zu lesen und zu ver- und bearbeiten, dies bei allen Operationen zu tun und die Zeitangaben nur bei der Erstellung der Ausgabe in die Zeitzone des Clients (Browser, Desktopprogramm, WhatEver) umzurechnen. Das kann jetzt aber in einem Haufen Arbeit ausarten, weil eventuell das halbe Konzept umgestellt werden müsste.

                  Unter der Voraussetzung, dass der Datenbankserver weiß, in welcher Zeitzone er sich befindet und es sich hier um einen MS-SQL-Server handelt [1] und es um einen oder mehrere Server geht, die alle in der selben Zeitzone arbeiten, ist es wahrscheinlich am einfachsten, den Server beim auslesen einer Tabellenzeile anzuweisen, den Datumswert von sich aus in einen Unix-Zeitstempel umzurechnen, statt dies einer weiterverarbeitenden Programmiersprache (hier C#) zu überlassen. Falls es sich um MS SQL handeln sollte, liefert diese Stackoverflow-Frage Lösungsansätze.

                  Bei der Weiterverarbeitung muss man nun „nur noch“ darauf achten, alle Zeitberechnungen explizit in der Zeitzone GMT/UTC durchzuführen und erst bei der Ausgabe die Ergebnisse in die Zeitzone des Clients umzurechnen.

                  Tschö, Auge

                  --
                  Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
                  Terry Pratchett, „Gevatter Tod“

                  1. Ich vermute wegen der hier gezeigten Zeitangaben mit Tausendstelsekunden einen MS-SQL-Server. ↩︎

                  1. Hallo,

                    vielen Dank an alle, die mir hierbei geholfen haben. Die Sache hat sich erledigt. Ich lese die Daten aus der Datenbank via Linq und sofort wandle diese in (MyTime - unixTime).TotalMilliseconds um, bevor ich die Daten an Javascript übergebe und die Umwandlung Json überlasse. Bei der Bearbeitung wandle ich die Daten wieder in Datum um. Ich habe zwar immer noch einen Zeitunterschied um eine Stunde (Zeitunterschied Berlin - London), das ist aber immer noch besser als der vorherige Zustand.

                    Gruß

                    1. Hallo

                      Die Sache hat sich erledigt. Ich lese die Daten aus der Datenbank via Linq und sofort wandle diese in (MyTime - unixTime).TotalMilliseconds um, bevor ich die Daten an Javascript übergebe und die Umwandlung Json überlasse. Bei der Bearbeitung wandle ich die Daten wieder in Datum um. Ich habe zwar immer noch einen Zeitunterschied um eine Stunde (Zeitunterschied Berlin - London), das ist aber immer noch besser als der vorherige Zustand.

                      Du hast Glück, dass Großbritannien und Deutschland die Umstellung zwischen den lokalen Normalzeiten und den Sommerzeiten zum selben Zeitpunkt vornehmen. Wäre das nicht so, hättest du zu bestimmten Zeiten einen Unterschied von 0 oder auch 2 Stunden zwischen Berlin und London.

                      Tschö, Auge

                      --
                      Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
                      Terry Pratchett, „Gevatter Tod“
  4. Hallo Forum,

    Bis dahin ist auch alles OK. Das Problem ist die Zeitzone des Rechners. Wie die auf Berlin steht, bekomme ich das korrekte Datum (Juli), nicht aber wenn diese auf London steht. Da bekomme ich ein falsches Datum (Juni). Hat da jemand eine Idee?

    An parseInt() würde ich das zweite Argument unbedingt mit übergeben um sicher zu gehen, dass da bspw. zur Basis 10 gerechnet wird.

    Dag