So was wie Departure - bzw. Reading mit Restlaufzeit?

Begonnen von tomster, 03 Februar 2025, 14:30:33

Vorheriges Thema - Nächstes Thema

tomster

Servus zusammen!

Kurz umrissen das Szenario:
Ich habe einen Busfahrplan (Skibus) mit Abfahrtszeiten in Papierform vor mir liegen: 10:06, 10:29, 11:01, usw. Nix digital. Nix REST-API.
Nun würde ich diese Daten gerne in der Form zur Anzeige bringen, als dass immer die Minuten bis zur nächstmöglichen Abfahrt angezeigt werden.

@Otto123 hat dankbarerweise in einem anderen Thread schon Mal eine passende Codezeile gepostet:
{my $t1="21:10";;my $t2=POSIX::strftime("%H:%M",localtime(time()));;$t1=~ /(\d\d).(\d\d)/;;my $m1= $1*60+$2;;$t2=~ /(\d\d).(\d\d)/;;my $m2= $1*60+$2;;return $m2-$m1}
Damit bekomme ich schon Mal die Minuten bis zur gewünschten Abfahrtszeit ($t1) ausgeworfen.

Frage(n):
Wie "automatisiere" ich so etwas? Genauer gesagt, wie erhalte ich aus einer Definition (Textfile/CSV/Array/etc.) von Abfahrtszeiten immer diejenige Zeitspanne bis zur nächstbevorstehenden Abfahrt (andere Uhrzeiten werden dann "ausgeblendet")?
Und wie triggert man so ein Script möglichst elegant, damit immer der korrekte Minutenwert in einem Reading (->FTUI3) landet ohne dass der zugehörige Prozeß unnötig oft angestoßen wird?
DOIF? my_Utils?
Vielen Dank schon Mal für Eure Rückmeldungen!

betateilchen

Die Abfahrtszeiten kommen in ein array und werden mit der aktuellen Zeit verglichen.
Wichtig ist nur, dass die Abfahrtszeiten im array chronologisch aufsteigend angegeben werden.

sub abfahrt {

  sub secondsFromMidnight{
    my @time = localtime();
    return (($time[2] * HOURSECONDS) + ($time[1] * MINUTESECONDS) + $time[0]);
  }

  my @zeiten = ("16:30","17:00","17:30","18:00");
  my $now    = secondsFromMidnight();
  my $s;
 
  for (@zeiten) {
    my ($h,$m) = split(/:/,$_);
$s = $h*HOURSECONDS + $m*MINUTESECONDS;
last if ($s > $now);
  }
  return int(($s-$now)/MINUTESECONDS);
}

Zitat von: tomster am 03 Februar 2025, 14:30:33Und wie triggert man so ein Script möglichst elegant, damit immer der korrekte Minutenwert in einem Reading landet ohne dass der zugehörige Prozeß unnötig oft angestoßen wird?

Einmal pro Minute per at ein setreading mit dem ermittelten Minutenwert ausführen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

tomster

#2
Läuft einwandfrei! Hätt ich auch nicht anders erwartet ;-.)
Nochmal besten Dank betateilchen!!

betateilchen

#3
Prima!

Noch ein Tipp, falls jemand das Ergebnis lieber im Format hh:mm haben möchte:

return POSIX::strftime("%H:%M",gmtime($s-$now));
(mit der Einschränkung, dass das nur für Abfahrten am gleichen Tag funktioniert.)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

tomster

*hüstel*
Bei mir ergibt die 2. Variante einen immer um 1 Stunde zu hohen Zeitraum...

betateilchen

Ja, sorry.
Mit gmtime() statt localtime() sollte es aber passen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!