Uhrzeit-Rechnen in der Shell
-
- Beiträge: 287
- Registriert: 05.02.2013 19:47:41
Uhrzeit-Rechnen in der Shell
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!
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$$
Re: Uhrzeit-Rechnen in der Shell
Normalerweise schmeisse ich saemtliche menschenlesbare Datumsformate gegen date(1) und lasse Unix-Sekunden daraus bauen, ggf. mit %N fuer Nanosekunden:Damit hat man dann int-Zahlen, die man problemlos voneinander abziehen kann.
Gruss Cae
Code: Alles auswählen
$ date -d"$(date)" +%s%N
1375547625000000000
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
Re: Uhrzeit-Rechnen in der Shell
Code: Alles auswählen
date -d @Unix-Sekunden
-
- Beiträge: 287
- Registriert: 05.02.2013 19:47:41
Re: Uhrzeit-Rechnen in der Shell
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!
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$$
Re: Uhrzeit-Rechnen in der Shell
date kann nicht nur umrechnen. Beispiel:
Code: Alles auswählen
date -d +1days
-
- Beiträge: 287
- Registriert: 05.02.2013 19:47:41
Re: Uhrzeit-Rechnen in der Shell
Ich lege mal vor: 37327Wie 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!
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] $
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$$
Re: Uhrzeit-Rechnen in der Shell
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
Ein paar Zeilen drum herum und es sollte ein wenig flexibler sein als dein Skript.
[1]http://search.cpan.org/~drolsky/DateTim ... ateTime.pm
-
- Beiträge: 287
- Registriert: 05.02.2013 19:47:41
Re: Uhrzeit-Rechnen in der Shell
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.Liffi hat geschrieben:Wenn man eh schon Perl nimmt...
Die "paar Zeilen" gibt's offenbar noch nicht! Ich bin gepannt deinen Code zu lesen...Ein paar Zeilen drum herum...
-der_linux_cowboy --- Besser werden! ... f*** w$$
Re: Uhrzeit-Rechnen in der Shell
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.linuxCowboy hat geschrieben:Die "paar Zeilen" gibt's offenbar noch nicht! Ich bin gepannt deinen Code zu lesen...Ein paar Zeilen drum herum...
[1] 37329
-
- Beiträge: 287
- Registriert: 05.02.2013 19:47:41
Re: Uhrzeit-Rechnen in der Shell
Erstmal Anerkennung, dass du deinen Worten Taten folgen läßt! (Von vielen anderen hätte man plötzlich nichts mehr gehört.)Liffi hat geschrieben:...und habe es deshalb mal in Python gemacht!
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
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$$
-
- Beiträge: 287
- Registriert: 05.02.2013 19:47:41
Re: Uhrzeit-Rechnen in der Shell
so performt die bash:
37334
Pflicht...
und Kür
Dauert länger als mit Perl, aber
bash und coreutils - others are for wimps!
37334
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
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 $
bash und coreutils - others are for wimps!
-der_linux_cowboy --- Besser werden! ... f*** w$$
Re: Uhrzeit-Rechnen in der Shell
für die Skriptübungen
Aber irgendwann fängt es an zu spinnen.
(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"
AuchPhineas hat geschrieben: date kann nicht nur umrechnen.
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
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
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")
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")
Re: Uhrzeit-Rechnen in der Shell
Weil es gerade so schön passt, hier ein Rechner für die beweglichen Feiertage nach der gaußschen Osterformel:
Bei mir nur bis 2037 (veraltete Distri).
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