Ankündigung

Einklappen
Keine Ankündigung bisher.

Datumsproblem?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Datumsproblem?

    Hallo PHP Gemeinde

    Ich habe vor einiger Zeit einen Schichtplan mit PHP erstellt, der auch wunderschön funktioniert. Da ich nun Feiertage noch integrieren wollte, bin ich auf das Problem mit Sommer-/Winterzeit gestossen.

    Der Plan wird immer für eine Woche angezeigt. Grob gesagt, läuft es so ab:

    - Die Kalenderwoche wird an das Script übergeben
    - Aus der KW wird der Montag berechnet als Timestamp z.B. (1287352800 für 18.10.2010 00:00:00)
    - für jeden weiteren Tag in der Woche werden 86400 zum Timestamp addiert.
    - Ist in der DB ein Eintrag mit genau diesem Timestamp gespeichert, wird der Eintrag am entsprechenden Tag angezeigt.

    So ähnlich werden die Schichten auch in die DB geschrieben.

    Sehr ihr da irgendwelche Probleme? Muss ich damit befürchten, dass es nach der Winterzeitumstellung nicht mehr übereinstimmt? Ich denke zwar nicht... aber sicher bin ich mir nicht. Ich hätte wohl von Anfang an alles mit gmmktime und gmdate programmieren sollen, dann müsste ich mir deswegen keine Gedanken machen. Aber wenn ich das im Nachhinein ändere, stimmen die Einträge nicht mehr


  • #2
    Muss ich damit befürchten, dass es nach der Winterzeitumstellung nicht mehr übereinstimmt?
    Kommt drauf an, was „Aus der KW wird der Montag berechnet“ bedeuten mag.
    --

    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


    --

    Kommentar


    • #3
      Zitat von nikosch Beitrag anzeigen
      Kommt drauf an, was „Aus der KW wird der Montag berechnet“ bedeuten mag.
      Diese Funktion berechnet den Timestamp eines Montags aus der Kalenderwoche:

      PHP-Code:
      function mondaykw($kw,$jahr)
      {
         
      $firstmonday firstkw($jahr);
         
      $mon_monat date('m',$firstmonday);
         
      $mon_jahr date('Y',$firstmonday); 
         
      $mon_tage date('d',$firstmonday); 
         
      $tage = ($kw-1)*7
         
      $mondaykw mktime(0,0,0,$mon_monat,$mon_tage+$tage,$mon_jahr); 
         return 
      $mondaykw

      Kommentar


      • #4
        firstkw($jahr);
        --

        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


        --

        Kommentar


        • #5
          Da Du zeitrelational zu einem statischen Datum im Winter rechnest, dürftest Du auf jeden Fall Probleme bekommen. Wenn ich richtig folgere, zeigt Dein Kalender im Sommer jeweils auf Sonntag, 23:00 Uhr.
          --

          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


          --

          Kommentar


          • #6
            Entschuldige...


            PHP-Code:
            function firstkw($jahr)

               
            $erster mktime(0,0,0,1,1,$jahr); 
               
            $wtag date('w',$erster);

                if (
            $wtag <= 4)
                {
                   
            /** 
                    * Donnerstag oder kleiner: auf den Montag zurückrechnen. 
                    */ 
                   
            $montag mktime(0,0,0,1,1-($wtag-1),$jahr);
                   }
                   else
                   {
                   
            /** 
                    * auf den Montag nach vorne rechnen. 
                    */                                                                         
                   
            $montag mktime(0,0,0,1,1+(7-$wtag+1),$jahr); 
                   } 
                   return 
            $montag;

            Kommentar


            • #7
              Ich bin sicher, mit [MAN]strtotime[/MAN] bekommst Du da was besseres hin. [MAN]date_default_timezone_set[/MAN] nicht vergessen!
              --

              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


              --

              Kommentar


              • #8
                Erstmal vielen Dank für Deine Antworten!

                Ich bin immer noch nicht überzeugt dass es Probleme gibt, aber auch nicht dass es geben könnte .

                Wenn ich heute Kalendereinträge mache, haben diese folgende Timestamps:
                1271376000 2010-04-16 16.04.2010 02:00 1 Sommerzeit
                1271376000 2010-04-16 16.04.2010 02:00 1 Sommerzeit
                1292803200 2010-12-20 20.12.2010 01:00 0 Winterzeit
                1292889600 2010-12-21 21.12.2010 01:00 0 Winterzeit
                1292976000 2010-12-22 22.12.2010 01:00 0 Winterzeit
                1293062400 2010-12-23 23.12.2010 01:00 0 Winterzeit

                Wenn wir jetzt Dezember hätten, sollten dann die errechneten Timestamps für die selben Tage nicht immer noch die gleichen sein?

                Wo könnte ich denn mit strtotime etwas besseres hinbekommen, als mit gmdate, gmmktime?

                Kommentar


                • #9
                  Da liegt der Witz:

                  1271376000 2010-04-16 16.04.2010 02:00 1 Sommerzeit
                  1292803200 2010-12-20 20.12.2010 01:00 0 Winterzeit
                  Wenn Dir das egal ist, gibts auch kein Problem. Aber IMHO sollte ein Schichtplan-Tag auch um 0:00 anfangen. Spätestens wenn Du mit diesen Timestamps weiterrechnest.
                  --

                  „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                  Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                  --

                  Kommentar


                  • #10
                    Grundsätzlich ist es egal, da die Zeit nicht grafisch dargestellt wird. Der Wochenplan wird in einer Tabelle dargestellt, dabei ist eine Zelle = 1 Tag, die Schicht wird nur durch die Anzeige eines entsprechenden Textes und durch Farben unterschieden.

                    Mir gehts nur um das auslesen der eingetragenen Schichten. Solange ein Timestamp eines beliebigen Datums in der Winterzeit genau gleich ist wie in der Sommerzeit, dann gibts keine Probleme. Nur bin ich mir halt nicht sicher, ob das wirklich so ist, und ich weiss nicht wie ich das testen könnte.

                    Kommentar


                    • #11
                      nun .. der Timestamp für Mitternacht eines Tages ist in der Sommerzeit eigentlich um 3600 niedriger - die Uhren werden ja schließlich um 1 Stunde vorgestellt -(der Tag der Zeitumstellung im März hat nur 23 Stunden, während der Tag, wo es auf Winterzeit zurückgeht entsprechend 25 Stunde zählt, die Zeit von 2:00 Uhr bis 3:00 Uhr wird halt 2 mal durchlaufen) -

                      das heißt theoretisch beginnt dein Schicht-tag im Sommer 1 Stunde später - wenn du immer mit 24 Stunden rechnest - wenn es aber nur auf ganze Tage ankommt, sollte das kaum groß auffallen.

                      Aufpassen musst du aber in der Nachtschicht - falls soetwas in Betracht kommt , denn die würde durch den Timestamp 1 Stunde zu wenig Arbeitszeit ausweisen ... (dein Timestamp erkennt ja erst um 1:00 Uhr CEST , dass der neue Arbeitstag angefangen hat, würde dann 5 Stunden bis 6:00 Uhr (normales Nachtschicht-Ende) berechnen und 2 Stunden vor Mitternacht = macht 7 Stunden gesamt ...
                      "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

                      Kommentar


                      • #12
                        und wenn man anstatt $timestamp+86400 einfach strtotime('+1 day', $timestamp) nutzt, wie schon erwähnt treten erst gar keine Probleme mit der Sommer-/Winterzeit auf...

                        Kommentar


                        • #13
                          Nur bin ich mir halt nicht sicher, ob das wirklich so ist, und ich weiss nicht wie ich das testen könnte.
                          Indem DU die Serveruhr umstellst?
                          --

                          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                          --

                          Kommentar


                          • #14
                            Ich kann nur empfehlen es direkt ordentlich zu machen. Das vorgehen nach dem Motto: sch**ß auf Sommer/Winterzeit führt bei einem Projekt der Firma bei der ich arbeitet regelmäßig zu Problemen.

                            Kommentar


                            • #15
                              Danke für Eure Antworten!

                              Bei der Umstellung wurde nichts durcheinandergebracht, es hat also doch funktioniert

                              Kommentar

                              Lädt...
                              X