Uhrzeit-Rechnen in der Shell

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Uhrzeit-Rechnen in der Shell

Beitrag von linuxCowboy » 03.08.2013 18:29:36

Wie läßt sich in der bash komfortabel mit Uhrzeiten rechnen?

z.B.:
Fclock_calc 11:37 17:53 ergibt die abgelaufene Zeit

11:37 +1:33 +2:04 summiert auf

22:22 0:55 ebenfalls die Zeit!
-der_linux_cowboy --- Besser werden! ... f*** w$$

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Uhrzeit-Rechnen in der Shell

Beitrag von Cae » 03.08.2013 18:35:11

Normalerweise schmeisse ich saemtliche menschenlesbare Datumsformate gegen date(1) und lasse Unix-Sekunden daraus bauen, ggf. mit %N fuer Nanosekunden:

Code: Alles auswählen

$ date -d"$(date)" +%s%N
1375547625000000000
Damit hat man dann int-Zahlen, die man problemlos voneinander abziehen kann.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Benutzeravatar
Phineas
Beiträge: 354
Registriert: 20.06.2012 20:26:19

Re: Uhrzeit-Rechnen in der Shell

Beitrag von Phineas » 03.08.2013 18:47:43

Code: Alles auswählen

date -d @Unix-Sekunden
liefert das gewohnte Datum wieder zurück.

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Uhrzeit-Rechnen in der Shell

Beitrag von linuxCowboy » 03.08.2013 19:24:31

Ja, danke, das ist der Weg "zu Fuß". Ich setze das in ein Script, und bin dann selbst für alle Checks verantwortlich.

Ich hatte nur gehofft, es gibt schon etwas Elegantes für diesen doch häufigen Anwendungsfall!

PS: Vielleicht ist das "Elegante" hier das date-command (wieder mal aus den coreutils), das alle möglichen Umrechnungen anbietet!
-der_linux_cowboy --- Besser werden! ... f*** w$$

Benutzeravatar
Phineas
Beiträge: 354
Registriert: 20.06.2012 20:26:19

Re: Uhrzeit-Rechnen in der Shell

Beitrag von Phineas » 03.08.2013 20:22:14

date kann nicht nur umrechnen. Beispiel:

Code: Alles auswählen

date -d +1days

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Uhrzeit-Rechnen in der Shell

Beitrag von linuxCowboy » 04.08.2013 14:17:03

Wie läßt sich in der bash komfortabel mit Uhrzeiten rechnen?

z.B.:
Fclock_calc 11:37 17:53 ergibt die abgelaufene Zeit

11:37 +1:33 +2:04 summiert auf

22:22 0:55 ebenfalls die Zeit!
Ich lege mal vor: NoPaste-Eintrag37327

Code: Alles auswählen

530 0 /tmp $ Pclockcalc.pl 11:37 17:53 # No.1
06:16 h
531 0 /tmp $ Pclockcalc.pl 11:37 +1:33 +2:04 # No.2
15:14 h
532 0 /tmp $ Pclockcalc.pl 22:22 0:55 # No.3
02:33 h
533 0 /tmp $ Pclockcalc.pl +1:33 +2:04 +04:02 # only sum-up
07:39 h
534 0 /tmp $ Pclockcalc.pl +1:33 2:4 4:2 # convenience
07:39 h
535 0 /tmp $ Pclockcalc.pl 23:23 +1:11 # base + sum-up
00:34 h
536 0 /tmp $ Pclockcalc.pl
usage: /usr/local/bin/Pclockcalc.pl start_time end_time || [start_time] +add_time...
537 0 /tmp[255] $ 
Die Parameter-Prüfung ist implementiert.
Sicher gibts noch was zu golfen!
Man könnte auch den Ansatz allgemeiner fassen, und z.B. minus zulassen oder mehr als 24h...
-der_linux_cowboy --- Besser werden! ... f*** w$$

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: Uhrzeit-Rechnen in der Shell

Beitrag von Liffi » 04.08.2013 14:35:51

Wenn man eh schon Perl nimmt, warum dann nicht auch das wirklich brauchbare DateTime[1]?
Ein paar Zeilen drum herum und es sollte ein wenig flexibler sein als dein Skript.

[1]http://search.cpan.org/~drolsky/DateTim ... ateTime.pm

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Uhrzeit-Rechnen in der Shell

Beitrag von linuxCowboy » 04.08.2013 15:33:00

Liffi hat geschrieben:Wenn man eh schon Perl nimmt...
Ein Perl-Script ist für mich noch Shell. Statt auf Krampf etwas in bash oder sed zu zwängen, nutze ich die mächtigen REs und die einfachen Berechnungen. Und sed und awk sind genauso extern.
Ein paar Zeilen drum herum...
Die "paar Zeilen" gibt's offenbar noch nicht! Ich bin gepannt deinen Code zu lesen...
-der_linux_cowboy --- Besser werden! ... f*** w$$

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: Uhrzeit-Rechnen in der Shell

Beitrag von Liffi » 04.08.2013 16:59:30

linuxCowboy hat geschrieben:
Ein paar Zeilen drum herum...
Die "paar Zeilen" gibt's offenbar noch nicht! Ich bin gepannt deinen Code zu lesen...
Nun denn. Ich war zu faul mein Perl aufzufrischen. Ist schon ein paar Tage her und habe es deshalb mal in Python gemacht[1]. Der Code enthält noch einen fiesen Hack, aber es sollte einfach sein, es so anzupassen, dass es auch mit anderen Datumsformaten umgehen kann.

[1] NoPaste-Eintrag37329

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Uhrzeit-Rechnen in der Shell

Beitrag von linuxCowboy » 04.08.2013 17:56:52

Liffi hat geschrieben:...und habe es deshalb mal in Python gemacht!
Erstmal Anerkennung, dass du deinen Worten Taten folgen läßt! (Von vielen anderen hätte man plötzlich nichts mehr gehört.)

Ich kenne mich nicht aus mit Python. Aber wir haben die Tests:

Code: Alles auswählen

553 0 /tmp $ ./Pclockcalc.py 11:37 17:53
6:16:00
554 0 /tmp $ ./Pclockcalc.py 11:37 +1:33 +2:04
15:14:00
555 0 /tmp $ ./Pclockcalc.py 22:22 0:55
-1 day, 2:33:00
...und die besteht der Code.

Ich hatte die DateTime.pm schon im Hinterkopf. Und irgendwie gibts doch inzwischen zu allem ein Modul.

Vielleicht kommt ja noch jemand der das damit implementiert, und damit "flexibler" macht! ;-)

EDIT:
Sowohl date, als auch perl und python können mit Zeitformaten umgehen. Doch das sind nur APIs. Backends. Die Kunst ist jetzt gerade, diese, "flexibel", an den Mann zu bringen!
-der_linux_cowboy --- Besser werden! ... f*** w$$

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Uhrzeit-Rechnen in der Shell

Beitrag von linuxCowboy » 07.08.2013 20:09:12

so performt die bash:
NoPaste-Eintrag37334

Pflicht...

Code: Alles auswählen

881 0 /tmp $ clockcalc.sh 11:37 17:53
06:16 h
882 0 /tmp $ clockcalc.sh 11:37 +1:33 +2:04
15:14 h
883 0 /tmp $ clockcalc.sh 22:22 0:55
02:33 h
und Kür

Code: Alles auswählen

884 0 /tmp $ clockcalc.sh +1:33 +2:04 +04:02
07:39 h
885 0 /tmp $ clockcalc.sh +1:33 2:4 4:2
07:39 h
886 0 /tmp $ clockcalc.sh 23:23 +1:11
00:34 h
887 0 /tmp $ clockcalc.sh 11:22 -3:33
07:49 h
888 0 /tmp $ clockcalc.sh -3:33 4:44
01:11 h
889 0 /tmp $ clockcalc.sh -3:33 4:44 +23:55
01:06 h
890 0 /tmp $ 
890 0 /tmp $ clockcalc.sh
usage: clockcalc.sh start_time end_time || [start_time] +add_time|-sub_time...
891 0 /tmp $
Dauert länger als mit Perl, aber

bash und coreutils - others are for wimps! :wink:
-der_linux_cowboy --- Besser werden! ... f*** w$$

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Uhrzeit-Rechnen in der Shell

Beitrag von rendegast » 08.08.2013 08:27:08

:hail: für die Skriptübungen

Phineas hat geschrieben: date kann nicht nur umrechnen.
Auch

Code: Alles auswählen

$ date -d "2000 years ago + 4 weeks"
Do 5. Sep 08:19:05 LMT 0013

Code: Alles auswählen

$ date -d "2100 years ago + 4 weeks"
Fr 5. Sep 08:20:09 LMT -087
Aber irgendwann fängt es an zu spinnen.

Code: Alles auswählen

$ date -d "80003000000 years ago"
date: ungültiges Datum „80003000000 years ago“
$ date -d "800300000000 years ago"
So 8. Aug 08:25:32 LMT -1436080931
(Ist das eine NSA-Backdoor?)
Entsprechende http://bugs.debian.org/coreutils, will never fix?
Wegen des gewissen funny-Faktors solcher Spielereien vielleicht irgendwas in der Art
"ERROR statt Ausgabe von Kalenderdaten außerhalb eines Bereichs"
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Benutzeravatar
Phineas
Beiträge: 354
Registriert: 20.06.2012 20:26:19

Re: Uhrzeit-Rechnen in der Shell

Beitrag von Phineas » 08.08.2013 15:03:39

Weil es gerade so schön passt, hier ein Rechner für die beweglichen Feiertage nach der gaußschen Osterformel:

Code: Alles auswählen

#!/bin/bash
J=$(date +%Y); [ "$1" ] && [ "$1" = "${1//[^0-9]}" ] && [ $1 -ge 1902 -a $1 -le 2037 ] && J=$1

echo "${J}:"

a=$(( $J % 19 ))
b=$(( $J % 4 ))
c=$(( $J % 7 ))
m=$((( (8 * ($J / 100) + 13) / 25) - 2 ))
s=$(( ($J / 100) - ($J / 400) - 2 ))
M=$(( (15 + $s - $m) % 30 ))
N=$(( (6 + $s) % 7 ))
d=$(( ($M + 19 * $a) % 30 ))
if [ $d = 29 ]; then
  D=28
elif [ $d = 28 -a $a -ge 11 ]; then
  D=27
else
  D=$d
fi
e=$(( (2 * $b + 4 * $c + 6 * $D + $N) % 7 ))
o=$( date -d ${J}-03-21+$(($D + $e + 1))days +%Y-%m-%d )

for t in "-48 Rosenmontag" "-2 Karfreitag" "+0 Ostersonntag" "+1 Ostermontag" "+39 Christi Himmelfahrt" "+49 Pfingstsonntag" "+50 Pfingstmontag" "+60 Fronleichnam"; do
  echo "$( date -d ${o}${t%% *}days "+%d.%m." ) ${t#* }"
done
Bei mir nur bis 2037 (veraltete Distri).

Antworten