Jochen Ehlert: Rechnen mit Zeiten

Hallo liebes Forum,
ich bin relativer Perlneuling und stehe vor folgendem Problem:
Ich bastele zur Zeit an einem Rechner, der über ein Webinterface Radiosendungen aufnehmen soll.
Zur Zeit realisiere ich das per HTML und Perl, wobei dann am Ende ein neuer Cronjob erstellt wird. Um Doppler auszuschließen lese ich die Crontab aus, und will nun überprüfen, ob zu einer bestimmten Zeit schon ein Job geplant ist.
Soweit sogut - allerdings sind alle Zeitangaben, die ich habe im Format $monat, $tag, $stunde, $minute und um Überschneidungen auszuschließen muß ich ‚ne Menge if-Schleifen durchlaufen.
Also, gibt es innerhalb von Perl eine Funktion, die mir aus $monat, $tag, $stunde, $minute eine einzelne Zeitangabe - wie zum Beispiel die Ausgabe von time() (Sekunden seit dem 1.1. 1970) macht?

Danke für jedwede Anregungen

Jochen

  1. Hi,

    auszuschließen muß ich ‚ne Menge if-Schleifen durchlaufen.

    If-Schleifen? *g* cooler Ausdruck *g*

    Also, gibt es innerhalb von Perl eine Funktion, die mir aus
    $monat, $tag, $stunde, $minute eine einzelne Zeitangabe - wie zum
    Beispiel die Ausgabe von time() (Sekunden seit dem 1.1. 1970)
    macht?

    eine Fkt nicht, dass ich wuesste... ist auch nicht moeglich, da die
    Angabe zur Jahreszahl fehlt. Was du aber machen kannst, ist, dass
    ganze in Sek (oder auch MSek) seit Anfang des Jahres umzurechnen. Das
    geht so:

    sub min_seit_jan
    {
    my $monat = shift @_;
    my $tag = shift @_;
    my $stunde = shift @_;
    my $min = shift @_;

    my $zeit = 0;

    Tage seit Monats-Anfang ausrechnen

    for($i=0;$i<=$monat-1;$i++)
      {
      # Hat der Monat 31 oder 30 Tage?
      if($i % 2 != 0)
       {
       $zeit += 31;
       } else {

    # ist der aktuelle Monat Februar? Ja -> +28 Tage, nein -> +30 Tage
       $zeit += $i == 2 ? 28 : 30;
       }
      }

    Tage des aktuellen Monats hinzufuegen

    $zeit += $tag;

    umrechnen in Stunden und Stunden des aktuellen Tags addieren

    $zeit *= 24 + $stunde;

    umrechnen in Minuten und Minuten seit Anfang der Stunde addieren

    $zeit *= 60 + $minute;

    return $zeit;
    }

    Aufgerufen wird das ganze ueber

    $zeit = &min_seit_jan($monat, $tag, $stunde, $minute);

    Jetzt hast du die Minuten seit Anfang des Jahres...

    mfg
    CK1

    1. Hi!

      Eigentlich brauchst Du aber auch hier das Jahr:

      # ist der aktuelle Monat Februar? Ja -> +28 Tage, nein -> +30 Tage

      Denn was ist, wenn's nächst Schaltjahr ran ist?

      Gruß Frank

      P.S. ist ja erst 2004, und bei der schnelllebigen Zeit ist das Script dann vielleicht nicht mehr im Einsatz. Aber genau diese Einstellung hat uns ja gerade einige Probleme bescheert :-)

  2. Hallo Jochen!

    ... wobei dann am Ende ein neuer Cronjob erstellt wird...

    Kannst Du mir sagen, wie Du das machst (per system("crontab $File", ???);  )? Und das auslesen (system("crontab -l", ???);)?

    Besten Dank, Gruß Frank

    1. Hallo Frank,

      Ne, ich hänge einfach immer Zeilen hinten an eine Datei an (testfile) und lese dann dies Datei als neue crontab ein (crontab -l testfile)

      open (TMPFILE, ">>testfile");
      print TMPFILE "$daten......";
      close (TMPFILE)
      open (CRONTAB, "/usr/bin/crontab testfile");
      print CRONTAB "\n";   ## da weiß ich gar nicht, ob dieses RETURN eigentlich nötig ist, hatte aber bis jetzt keine Muße nachzusehen
      close (CRONTAB);

      Regelmäßig schmeisse ich dann aus dieser Datei die schon vergangenen Zeilen per Script wieder raus, damit ich den Überblick nicht verliere.

      Gruß, Jochen

      1. Hi,

        Du solltest gerade bei systemnahen Operationen immer(!) den Fehlercode abfangen:

        open (TMPFILE, ">>testfile");

        open(...) or die "Kann testfile nicht beschreiben: $!";

        close (TMPFILE)

        close(...) or die "Kann testfile nicht schliessen: $!";

        Letzteres ist nicht bei Lesezugriffen notwendig. Aber auch beim Pipen auf crontab solltest Du Fehler abfangen.

        print CRONTAB "\n";   ## da weiß ich gar nicht, ob dieses RETURN eigentlich nötig ist, hatte aber bis jetzt keine Muße nachzusehen

        Kann ich Dir leider auch nicht sagen, aber Leerzeilen dürften eigentlich nicht stören...

        Cheatah

  3. Hi,

    ich bin relativer Perlneuling

    dann solltest Du gelegentlich mal bei http://www.perl.com/CPAN/ reinschauen - für praktisch jedes Problem gibt es schon ein Modul. So auch hier:

    Also, gibt es innerhalb von Perl eine Funktion, die mir aus $monat, $tag, $stunde, $minute eine einzelne Zeitangabe - wie zum Beispiel die Ausgabe von time() (Sekunden seit dem 1.1. 1970) macht?

    perldoc Time::Local

    Cheatah

  4. Also man sollte nicht so schnell aufgeben und einfach länger im Forum stöbern: Ich hab‚ dann natürlich gestern noch in der Forums-Auslese gestöbert und natürlich gefunden, was ich suchte:
    http://www.teamone.de/selfhtml/sfausles/tsfa_tef.htm#a5 (Konvertierung von verschiedenen Zeitangaben).
    Trotzdem - Dank an alle, die so schnell geantwortet haben.
    Gruß Jochen