Peter: Aktuelles Datum -3 Tage

Hallo zusammen,
mein Problem ist folgendes: Das aktuelle Datum auszugeben ist nicht allzu schwer, ich brauch aber das Datum von vor 3 Tagen. Kann mir da jemand vielleicht auf die Sprünge helfen? Das Datumsformat sollte dann so aussehen: 2005-06-05. Also Jahr, Tag, Monat. Einstellige Tage und Monate sollten noch eine 0 vorangestellt bekommen.

Danke schonmal für Eure Hilfe.

Gruß Peter

  1. hi Peter,

    mein Problem ist folgendes: Das aktuelle Datum auszugeben ist nicht allzu schwer, ich brauch aber das Datum von vor 3 Tagen. Kann

    $time = time; # Seconds since begin of the epoch 1.1.1970

    $time = $time - 3 * 86400; # 3 Tage zurück

    mir da jemand vielleicht auf die Sprünge helfen? Das Datumsformat sollte dann so aussehen: 2005-06-05. Also Jahr, Tag, Monat. Einstellige Tage und Monate sollten noch eine 0 vorangestellt bekommen.

    Kein Problem mit strftime:
    use POSIX qw(strftime);

    $date = strftime("%d.%m.%Y", localtime(time()));

    06.05.2005

    %d %m %Y sind Formate, siehe
    man date

    auf ner LINUX - Kiste.

    Viele Grüße, Rolf

    1. Moin!

      $time = $time - 3 * 86400; # 3 Tage zurück

      Auch du hast die Sommerzeitumstellung vergessen.

      • Sven Rautenberg
      1. Super. Danke für Eure Antworten.

        MfG
        Peter

      2. Moin!

        $time = $time - 3 * 86400; # 3 Tage zurück

        Auch du hast die Sommerzeitumstellung vergessen.

        Unsinn.

        Die PERL Funktion time() hat mit Sommerzeit absolut nichts zu tun.

        Viele Grüße, Rolf

        Tipp: gmtime(), localtime() ;-)

        1. $time = $time - 3 * 86400; # 3 Tage zurück

          Auch du hast die Sommerzeitumstellung vergessen.

          Unsinn.

          Die PERL Funktion time() hat mit Sommerzeit absolut nichts zu tun.

          Nein. Aber die Tatsache, dass nicht alle Tage im Jahr 24 Stunden haben.

          1. hi!

            Die PERL Funktion time() hat mit Sommerzeit absolut nichts zu tun.
            Nein. Aber die Tatsache, dass nicht alle Tage im Jahr 24 Stunden haben.

            time gibt die Anzahl der Sekunden seit einem bestimmten Datum zurück, zum
            Beispiel seit dem 1. Januar 1970, 0:00:00 UTC. Die Anzahl der Sekunden
            springt aber nicht wild hin und her, nur weil gerade irgendwo auf Sommerzeit
            oder Winterzeit umgestellt wurde.

            time    Returns the number of non-leap seconds since whatever time the
                         system considers to be the epoch, suitable for feeding to
                         "gmtime" and "localtime". On most systems the epoch is 00:00:00
                         UTC, January 1, 1970; a prominent exception being Mac OS Clas-
                         sic which uses 00:00:00, January 1, 1904 in the current local
                         time zone for its epoch.

            bye, Frank!

            --
            Never argue with an idiot. He will lower you to his level and then
            beat you with experience.
            1. Hi,

              time gibt die Anzahl der Sekunden seit einem bestimmten Datum zurück, zum
              Beispiel seit dem 1. Januar 1970, 0:00:00 UTC. Die Anzahl der Sekunden
              springt aber nicht wild hin und her, nur weil gerade irgendwo auf Sommerzeit
              oder Winterzeit umgestellt wurde.

              Es geht auch nicht um das Ergebnis von time, sondern um die Tatsache, daß ein Tag nicht immer 86400 Sekunden hat (wegen der Sommerzeit-Umstellung hat ein Tag im Jahr 3600 Sekunden mehr und einer 3600 Sekunden weniger).

              Es geht also um den Teil " - 3 * 86400".

              cu,
              Andreas

              --
              Warum nennt sich Andreas hier MudGuard?
              Schreinerei Waechter
              Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
              1. Moin!

                Es geht auch nicht um das Ergebnis von time, sondern um die Tatsache, daß ein Tag nicht immer 86400 Sekunden hat (wegen der Sommerzeit-Umstellung hat ein Tag im Jahr 3600 Sekunden mehr und einer 3600 Sekunden weniger).

                Es geht also um den Teil " - 3 * 86400".

                Tatsächlich hat ein Tag natürlich immer 24 Stunden, auch die Tage der Zeitumstellung, aber man wechselt dort eben die Zeitzone, von MEZ auf MESZ, und das führt zu einer Differenz von einer Stunde.

                Es besteht also das Problem, die Zeitzonenumrechnung korrekt durchzuführen. Wenn man ein Datum hat, dann kann man den Weg über die Sekunden gehen, dazu muß man dann aber genau wissen, ob das Tagesdatum plus Uhrzeit (ist die Frage, welche Zeit man da nimmt, 0 Uhr bietet sich an) nun Sommerzeit oder Winterzeit ist. Diesen Zeitpunkt rechnet man dann auf GMT um (-1/-2 Stunden), addiert oder subtrahiert dann die Zahl der Sekunden, rechnet das Ergebnis dann wieder passend (je nachdem, ob es Sommer- oder Winterzeit ist) zurück in MEZ oder MESZ - und stellt fest, dass man beim Übergang von Sommer- zu Winterzeit trotzdem eine Differenz von einer Stunde hat, man also nicht wieder genau bei 0 Uhr landet. Ist ja auch logisch, weil die Zeitzone ja gewechselt wurde. Und diese Differenz versaut einem dann das Datum.

                Es empfiehlt sich deshalb, eben gerade nicht mit der Zahl der Sekunden zu rechnen, die ein 24-Stunden-Tag lang ist.

                • Sven Rautenberg
                1. Hi,

                  Tatsächlich hat ein Tag natürlich immer 24 Stunden, auch die Tage der Zeitumstellung, aber man wechselt dort eben die Zeitzone, von MEZ auf MESZ, und das führt zu einer Differenz von einer Stunde.

                  Das hängt von der Definition von "Tag" ab (1 Erd-Rotation bzw. Zeit von Mitternacht bis Mitternacht bzw. sonstwas) ;-)

                  cu,
                  Andreas

                  --
                  Warum nennt sich Andreas hier MudGuard?
                  Schreinerei Waechter
                  Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
                2. Hallo,

                  Es besteht also das Problem, die Zeitzonenumrechnung korrekt durchzuführen.

                  Soweit ich weiss wird bei Perl dies von localtime automatisch durchgeführt. Also sollte die einfache Subtraktion (bzw. Addition) der gewünschten Zeitspanne in Sekunden von dem durch time ermittelten aktuellen Zeitpunkt der gewünschte Zeitpunkt ermittelt werden. Eine Berücksichtigung der allfälligen Sommerzeit ist unnötig solange am System die richtige Zeitzone eingestellt ist. Dann passen auch die Zeitpunkte der Umstellung.

                  Grüße
                    Klaus

                  1. Hi,

                    Soweit ich weiss wird bei Perl dies von localtime automatisch durchgeführt.

                    Ja, für das aktuelle Datum wird das berücksichtigt.

                    Also sollte die einfache Subtraktion (bzw. Addition) der gewünschten Zeitspanne in Sekunden von dem durch time ermittelten aktuellen Zeitpunkt der gewünschte Zeitpunkt ermittelt werden.

                    Aber gerade die Anzahl der zu addierenden/subtrahierenden Sekunden ist ja das Problem - es reicht eben nicht, die Anzahl der Tage mit 86400 zu multiplizieren.

                    cu,
                    Andreas

                    --
                    Warum nennt sich Andreas hier MudGuard?
                    Schreinerei Waechter
                    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
                    1. Hallo,

                      Aber gerade die Anzahl der zu addierenden/subtrahierenden Sekunden ist ja das Problem - es reicht eben nicht, die Anzahl der Tage mit 86400 zu multiplizieren.

                      Wer sagt das und wodurch wird das begründet? Und was hast Du durch Tests ermittelt?

                      $time = time;
                      for($i=0;$i<400;$i++)
                      {
                      print scalar(localtime($time))."\n";
                      $time -= 86400;
                      }

                      Diesen Code bitte mit unterschiedlichen Zeitzonen ausprobieren, und sich freuen, dass da einige bei der Implementierung von localtime mitgedacht haben, was auch der 9. Rückgabewert der Funktion im Listenkontext mehr als nur andeutet.

                      Nochmals: Warum kratzen, wenn's nicht juckt.

                      Grüße
                        Klaus

                      1. Hi,

                        Wer sagt das und wodurch wird das begründet? Und was hast Du durch Tests ermittelt?

                        Daß es eben nicht funktioniert.

                        $time = time;
                        for($i=0;$i<400;$i++)
                        {
                        print scalar(localtime($time))."\n";
                        $time -= 86400;
                        }

                        Kleine Modifikation, um das Problem zu zeigen:
                        Ich ziehe nur einmal am Anfang 15 Stunden ab - damit die ursprüngliche Zeit zwischen 0 und 1 Uhr liegt:

                          
                        $time = time - 15*3600;  
                        for($i=0;$i<400;$i++)  
                        {  
                            print scalar(localtime($time))."\n";  
                            $time -= 86400;  
                        }  
                        
                        

                        Das Ergebnis (gekürzt):

                        Sat May  7 00:33:08 2005
                        Fri May  6 00:33:08 2005
                        Thu May  5 00:33:08 2005
                        ...
                        Tue Mar 29 00:33:08 2005
                        Mon Mar 28 00:33:08 2005
                        Sat Mar 26 23:33:08 2005
                        Fri Mar 25 23:33:08 2005
                        ...
                        Tue Nov  2 23:31:35 2004
                        Mon Nov  1 23:31:35 2004
                        Sun Oct 31 23:31:35 2004
                        Sun Oct 31 00:31:35 2004
                        Sat Oct 30 00:31:35 2004
                        Fri Oct 29 00:31:35 2004
                        ...

                        Beachte dabei den 27. März und den 31. Oktober (Tage der Zeitumstellung)

                        Nochmals: Warum kratzen, wenn's nicht juckt.

                        Warum nicht waschen, es kratzt doch ...

                        cu,
                        Andreas

                        --
                        Warum nennt sich Andreas hier MudGuard?
                        Schreinerei Waechter
                        Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
              2. Es geht auch nicht um das Ergebnis von time, sondern um die Tatsache, daß ein Tag nicht immer 86400 Sekunden hat (wegen der Sommerzeit-Umstellung hat ein Tag im Jahr 3600 Sekunden mehr und einer 3600 Sekunden weniger).

                Es geht also um den Teil " - 3 * 86400".

                Ok, habe ich verstanden.
                Führt aber "nur" zum Fehler, wenn es gerade Mitternacht ist (+/-1 Stunde, je nachdem, ob Sommer- oder Winterumschaltung war) UND die Umschaltung innerhalb der 3 Tage stattfand.
                Oder?

                Gruß
                Reiner

                1. Hi,

                  Führt aber "nur" zum Fehler, wenn es gerade Mitternacht ist (+/-1 Stunde, je nachdem, ob Sommer- oder Winterumschaltung war) UND die Umschaltung innerhalb der 3 Tage stattfand.

                  In diesem speziellen Fall: ja.

                  Aber das reicht doch, um die Methode als "nicht zuverlässig" zu kennzeichnen.

                  cu,
                  Andreas

                  --
                  Warum nennt sich Andreas hier MudGuard?
                  Schreinerei Waechter
                  Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  2. Hallo Peter,

    mein Problem ist folgendes: Das aktuelle Datum auszugeben ist nicht allzu schwer, ich brauch aber das Datum von vor 3 Tagen. Kann mir da jemand vielleicht auf die Sprünge helfen? Das Datumsformat sollte dann so aussehen: 2005-06-05. Also Jahr, Tag, Monat. Einstellige Tage und Monate sollten noch eine 0 vorangestellt bekommen.

    Du brauchst zuerst mal die Funktion time(), sie gibt dir den aktuellen Unix-Zeitstempel. Von dem Rückgabewert ziehst du nun die Zahl 259200 ab (60*60*24*3 = 259200, d.h. drei Tage entsprechen 259200 Sekunden). Das Ergebnis dieser Berechnung kannst du nun an localtime() oder gmtime() weitergeben.

    Viele Grüße
      Patrick Canterino

    --
    "Natürlich haben die uns beschissen! Das sind die beschissensten Bescheißer, die uns beschissen haben!" (Homer Simpson)
    1. Moin!

      Von dem Rückgabewert ziehst du nun die Zahl 259200 ab (60*60*24*3 = 259200, d.h. drei Tage entsprechen 259200 Sekunden).

      Was ist mit der Sommerzeit? Einmal im Jahr ist ein Tag 25 Stunden lang, einmal nur 23 Stunden.

      • Sven Rautenberg
  3. weis nicht genau wie das in perl aussieht aber das wäre es in php:

    date('Y-m-d',time()-3600*24*3)

    1. weis nicht genau wie das in perl aussieht aber das wäre es in php:

      date('Y-m-d',time()-3600*24*3)

      in PERL ganz ähnlich:

      use POSIX qw(strftime);
      my $vorvorgestern = strftime("%Y-%m-%d", (localtime(time - 86400 * 3)) );
      print "$vorvorgestern\n"; # 2005-05-03

      Gruss, Rolf

      Formate zu date:

      Hier die komplette Liste der Formate (man date auf debian):
             FORMAT controls the output.  The only valid option for the
             second  form specifies Coordinated Universal Time.  Inter­
             preted sequences are:

      %%     a literal %

      %a     locale's abbreviated weekday name (Sun..Sat)

      %A     locale's full weekday name, variable  length  (Sun­
                    day..Saturday)

      %b     locale's abbreviated month name (Jan..Dec)

      %B     locale's  full  month  name,  variable length (Jan­
                    uary..December)

      %c     locale's date and time (Sat  Nov  04  12:02:33  EST
                    1989)

      %d     day of month (01..31)

      %D     date (mm/dd/yy)

      %e     day of month, blank padded ( 1..31)

      %h     same as %b

      %H     hour (00..23)

      %I     hour (01..12)

      %j     day of year (001..366)

      %k     hour ( 0..23)

      %l     hour ( 1..12)

      %m     month (01..12)

      %M     minute (00..59)

      %n     a newline

      %p     locale's AM or PM

      %r     time, 12-hour (hh:mm:ss [AP]M)

      %s     seconds  since  `00:00:00  1970-01-01  UTC'  (a GNU
                    extension)

      %S     second (00..60)

      %t     a horizontal tab

      %T     time, 24-hour (hh:mm:ss)

      %U     week number of year with Sunday  as  first  day  of
                    week (00..53)

      %V     week  number  of  year  with Monday as first day of
                    week (01..53)

      %w     day of week (0..6);  0 represents Sunday

      %W     week number of year with Monday  as  first  day  of
                    week (00..53)

      %x     locale's date representation (mm/dd/yy)

      %X     locale's time representation (%H:%M:%S)

      %y     last two digits of year (00..99)

      %Y     year (1970...)

      %z     RFC-822  style numeric timezone (-0500) (a nonstan­
                    dard extension)

      %Z     time zone (e.g., EDT), or nothing if no  time  zone
                    is determinable

      By  default,  date  pads  numeric fields with zeroes.  GNU
             date recognizes the following modifiers between `%' and  a
             numeric directive.

    2. Moin!

      weis nicht genau wie das in perl aussieht aber das wäre es in php:

      date('Y-m-d',time()-3600*24*3)

      Das Problem ist nur, dass zwei Tage im Jahr nicht 24 Stunden lang sind. Mit deinem Vorschlag fällst du also mindestens einmal im Jahr für einen Zeitraum von 3 Tagen auf die Nase, mit Pech auch zweimal.

      • Sven Rautenberg
      1. ein tag hat doch ca. 24h oder?

        versteh nicht ganz was gemeint ist,...

        1. Moin!

          ein tag hat doch ca. 24h oder?

          Sommerzeitumstellung.

          • Sven Rautenberg
          1. Hi,

            ein tag hat doch ca. 24h oder?

            Sommerzeitumstellung.

            was ändert sich an der Datumberechnung dadurch?

            Gruß
            Reiner

            1. Hi,

              was ändert sich an der Datumberechnung dadurch?

              Wenn Du das Datum des 25-Stunden-Tages hast (ohne Zeitangabe wird 0:00 Uhr genommen) und dazu 24 Stunden hinzuzählst, landest Du bei 23:00 desselben Tages (um 03:00 wurde ja auf 02:00 zurückgestellt) - und nicht bei 0:00 Uhr des nächsten Tags.

              cu,
              Andreas

              --
              Warum nennt sich Andreas hier MudGuard?
              Schreinerei Waechter
              Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  4. Moin!

    mein Problem ist folgendes: Das aktuelle Datum auszugeben ist nicht allzu schwer, ich brauch aber das Datum von vor 3 Tagen. Kann mir da jemand vielleicht auf die Sprünge helfen? Das Datumsformat sollte dann so aussehen: 2005-06-05. Also Jahr, Tag, Monat. Einstellige Tage und Monate sollten noch eine 0 vorangestellt bekommen.

    In PHP würde ich strtotime() empfehlen, und da die Grundlage dieser Funktion die  glibc-Bibliothek ist, sollte dies auch in Perl zur Verfügung stehen. Damit kannst du als Stringtext einfach drei Tage vom aktuellen (oder jedem anderen) Datum abziehen, die Bibliothek rechnet dir das korrekte Datum (mit Sommerzeit und Schaltjahren etc.) dann aus.

    http://de2.php.net/manual/de/function.strtotime.php

    Und per Google schnell gefunden:
    http://www.perlunity.de/php/manual/function.strtotime.shtml

    • Sven Rautenberg
    1. Moin!

      Und per Google schnell gefunden:
      http://www.perlunity.de/php/manual/function.strtotime.shtml

      Dumme Frage: Wieso gibts bei PERLunity das PHP-Handbuch. Gar nicht gesehen auf die Schnelle. Im Zweifel gibts für Perl aber ein CPAN-Modul dafür. :)

      • Sven Rautenberg
      1. Hallo Sven,

        Dumme Frage: Wieso gibts bei PERLunity das PHP-Handbuch. Gar nicht gesehen auf die Schnelle. Im Zweifel gibts für Perl aber ein CPAN-Modul dafür. :)

        Die Funktion Add_Delta_Days() aus Date::Calc hört sich interessant an, ob sie die Sommerzeit berücksichtigt, weiß ich aber nicht.

        Viele Grüße
          Patrick Canterino

        --
        "Das hat der liebe Gott nicht gut gemacht. Allen Dingen hat er Grenzen gesetzt, nur nicht der Dummheit." (Konrad Adenauer)
        1. Hi,

          Dumme Frage: Wieso gibts bei PERLunity das PHP-Handbuch. Gar nicht gesehen auf die Schnelle. Im Zweifel gibts für Perl aber ein CPAN-Modul dafür. :)

          Die Funktion Add_Delta_Days() aus Date::Calc hört sich interessant an, ob sie die Sommerzeit berücksichtigt, weiß ich aber nicht.

          die Sommerzeit ist bzgl. der Ausgangsfrage auch völlig unerheblich.
          Die Zeitumstellung hat am Datum noch nie etwas geändert.

          Gruß
          Reiner

          1. Hi,

            die Sommerzeit ist bzgl. der Ausgangsfrage auch völlig unerheblich.
            Die Zeitumstellung hat am Datum noch nie etwas geändert.

            Am Datum nicht, aber an der Länge des Tages - diese ist zwar im Durchschnitt immer noch 86400 Sekunden bzw. 24 Stunden, aber an einem Tag im Jahr sind es nur 23 Stunden und an einem Tag sind es 25 Stunden.
            Wenn für die Berechnung des Datums für die Differenz eine konstante Tageslänge verwendet wird, obwohl in der Realität die Tageslänge nicht konstant ist, gibt es selbstverständlich Fehler.

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            Schreinerei Waechter
            Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.