[Gelöst] Zeitdifferenz mit date(1)

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
alberich
Beiträge: 189
Registriert: 27.12.2019 10:12:24

[Gelöst] Zeitdifferenz mit date(1)

Beitrag von alberich » 17.02.2021 21:01:55

Außer mal ein `date' auf der Kommandozeile abzusetzen, weil ich zu faul bin mich zur Uhr umzudrehen, kann ich mit dem Befehl nicht viel anfangen. :wink:

Mich würde interessieren, wie berechnet man die Zeitspanne zwischen einem Datum in der Vergangenheit und jetzt. Mit meinen schwachen Python Kenntnissen mache ich das so:

Code: Alles auswählen

#/bin/python3

import datetime 
from datetime import timedelta

a = datetime.datetime(2021, 1, 13, 12, 0, 0)
b = datetime.datetime.now()

print(b-a)
Etwas ähnlich einfaches konnte ich mit `date' nicht herausbekommen.

/edit: Menschlicher, ohne Mirkosekunden

Code: Alles auswählen

#/bin/python3

import datetime 
from datetime import timedelta

a = datetime.datetime(2021, 1, 13, 12, 0, 0)
b = datetime.datetime.now()

c = a.replace(microsecond = 0)
d = b.replace(microsecond = 0)

print(d-c)
Zuletzt geändert von alberich am 18.02.2021 17:22:32, insgesamt 2-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Zeitdifferenz mit date(1)

Beitrag von Meillo » 17.02.2021 22:55:42

In Unix rechnet man mit Daten indem man sie in Unix Timestamps konvertiert und dann ganz einfach mit Ganzzahlen rechnen kann.

Z.B. so:

Code: Alles auswählen

expr \( `date +%s` - `date +%s -d 2021-01-13\ 12:00:00` \) / 60 / 60 / 24
Use ed once in a while!

tobo
Beiträge: 2349
Registriert: 10.12.2008 10:51:41

Re: Zeitdifferenz mit date(1)

Beitrag von tobo » 17.02.2021 23:39:36

Und auf die geforderte Ausgabe bezogen, dann z.B. so:

Code: Alles auswählen

d=$(($(date +%s) - $(date -d "2021-01-13 12:00:00" +%s)));printf "%d days, %02d:%02d:%02d\n" "$(($d/60/60/24))" "$(($d/60/60%24))" "$(($d/60%60))" "$(($d%60))"
Womöglich kann man aber $d (direkt durch date) geschickter ausgeben!?

alberich
Beiträge: 189
Registriert: 27.12.2019 10:12:24

Re: Zeitdifferenz mit date(1)

Beitrag von alberich » 18.02.2021 10:09:08

Okay, man muss das Datum erst umrechnen lassen.
Das Beispiel von Tobo funktioniert auch genauso wie mein Python Skript, während das von Meillo nur die Tage auswirft.
Was ich nicht ganz verstehe, denn ein einfaches `date' gibt ja etwa sowas aus: Do 18. Feb 10:07:45 CET 2021

Da ist die Uhrzeit bis zu den Sekunden dabei. Warum wird das dann gerundet? Wenn es ein Runden ist...

tobo
Beiträge: 2349
Registriert: 10.12.2008 10:51:41

Re: Zeitdifferenz mit date(1)

Beitrag von tobo » 18.02.2021 10:42:06

Da wird nichts gerundet. Wenn du dir mal die Ausgaben der date-Kommandos (wegen %s; man date) anschaust,

Code: Alles auswählen

## Datum jetzt
$ date +%s
1613640262

## Datum ablesbar
$ date -d "2021-01-13 12:00:00" +%s
1610535600
dann siehst du, dass da große Zahlen rauskommen. Das sind die von Meillo bereits genannten Unix Timestamps - also die, für das entsprechend abgefragte Datum, vergangenen Sekunden, seit dem 01.01.1970 00:00 Uhr. Das sind Ganzzahlen, die beiden oberen Werte voneinander subtrahiert ist eine Zeitspanne (Variable $d, weiterhin in Sekunden). Und die kann man umrechen, z.B. nach Tage oder Stunden (ohne Tage):

Code: Alles auswählen

$ d=$(($(date +%s) - $(date -d "2021-01-13 12:00:00" +%s)))
$ echo $d
3105465

## Tage
$ echo $(($d/60/60/24))
35
## Stunden
$ echo $(($d/60/60%24))
22

alberich
Beiträge: 189
Registriert: 27.12.2019 10:12:24

Re: Zeitdifferenz mit date(1)

Beitrag von alberich » 18.02.2021 10:51:47

tobo hat geschrieben: ↑ zum Beitrag ↑
18.02.2021 10:42:06
[...] wegen %s [...]
Ah ja, verstehe, das hatte ich nicht beachtet.

Danke allen! :D
henry

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Zeitdifferenz mit date(1)

Beitrag von Meillo » 18.02.2021 13:20:17

alberich hat geschrieben: ↑ zum Beitrag ↑
18.02.2021 10:09:08
Das Beispiel von Tobo funktioniert auch genauso wie mein Python Skript, während das von Meillo nur die Tage auswirft.
Es waere hilfreich gewesen, wenn du die Ausgabe deines Python-Scriptes gepostet haettest. ;-) Es war mir auch nicht klar, ob die Ausgabe des Scriptes genau das ist was du wolltest oder ob das nur exemplarisch war.

Sobald du die Sekundendifferenz hast, kannst du dir die mit einfacher Arithmetik ja in beliebiger Weise umformen. Ich habe wohl einfach vorausgesetzt, dass das kein Problem sein wuerde. ;-)

Ich dachte mir immer, dass es nett waere, wenn es bei Unix ein Standardtool fuer die Datums-Arithmetik gaebe, aber es war wohl nicht relevant genug. Addieren und Subtrahieren ist ja nicht das Problem via Timestamps, aber zur dynamisch skalierten menschenlesbaren Ausgabe einer Zeitdauer gibt es nichts Fertiges.
Use ed once in a while!

alberich
Beiträge: 189
Registriert: 27.12.2019 10:12:24

Re: Zeitdifferenz mit date(1)

Beitrag von alberich » 18.02.2021 13:47:15

Meillo hat geschrieben: ↑ zum Beitrag ↑
18.02.2021 13:20:17
Sobald du die Sekundendifferenz hast, kannst du dir die mit einfacher Arithmetik ja in beliebiger Weise umformen. Ich habe wohl einfach vorausgesetzt, dass das kein Problem sein wuerde. ;-)
Mmh, aber ich verstehe es nicht.

Damit habe ich das akutelle Datum (mit der Uhrzeit?) als Unix Timestamp.

Code: Alles auswählen

~ >> date +%s
1613651960
Damit habe ich das Datum in der Vergangenheit, zu dem ich die Differenz in Tagen, Stunden, Minuten, wegen mir auch Sekunden ausrechnen will.

Code: Alles auswählen

~ >> date +%s -d "2021-01-13 12:00:00"
1610535600
Mein Python Skript sagt im Übrigen so etwas:

Code: Alles auswählen

36 days, 1:42:11
Mein Herumrechnen mit den Sekunden ergibt dies:

Code: Alles auswählen

~ >> c
1613651960 -1610535600
3116360
last / 60
51939
last / 60
865
last / 24
36
24 * 36
864
Das heisst ich bekomme 36 Tage, und eine Stunde wird dann doch abgerundet. Mmh?

wanne
Moderator
Beiträge: 7557
Registriert: 24.05.2010 12:39:42

Re: Zeitdifferenz mit date(1)

Beitrag von wanne » 18.02.2021 13:51:29

Ich habe den
Habe immer denda:

Code: Alles auswählen

echo -n $((($(date +%s)-$(date -r /pfad/datei +%s))/3600/24)) Tage\ ; TZ=UTC date -d  @$(($(date +%s)-$(date -r /pfad/datei +%s))) "+%X"
Bzw.

Code: Alles auswählen

echo -n $((($(date +%s)-$(date -d "2021-02-12 13:37" +%s))/3600/24)) Tage\ ; TZ=UTC date -d  @$(($(date +%s)-$(date -d "2021-02-12 13:37" +%s))) "+%X"
Achtung: Da ist das Datum/die Datei zwie mal drin.
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Zeitdifferenz mit date(1)

Beitrag von Meillo » 18.02.2021 14:37:55

alberich hat geschrieben: ↑ zum Beitrag ↑
18.02.2021 13:47:15
Mein Herumrechnen mit den Sekunden ergibt dies:

Code: Alles auswählen

~ >> c
1613651960 -1610535600
3116360
last / 60
51939
last / 60
865
last / 24
36
24 * 36
864
Das heisst ich bekomme 36 Tage, und eine Stunde wird dann doch abgerundet. Mmh?
Das sind alles Ganzzahldivisionen. Die Kommastellen werden einfach gekappt (nicht gerundet sondern abgeschnitten). Wenn du modulo teilst (%), dann bekommst du den Rest, der die Anzahl in der kleineren Einheit ist. Mit dem Ergebnis der Ganzzahlteilung rechnest du weiter. Dir fehlen oben bloss die Modulo-Teilungen, die dir die Zahlen fuer die Ausgabe liefern, siehe:

Code: Alles auswählen

:-) expr 3116360 % 60 # sekunden
20

:-) expr 3116360 / 60 # minuten 
51939

:-) expr 51939 % 60 # minuten
39

:-) expr 51939 / 60 # stunden
865

:-) expr 865 % 24 # stunden  
1

:-) expr 865 / 24 # tage   
36

:-) echo 36 tage, 01:39:20
36 tage, 01:39:20

:-) 
So kannst du dir das selber zusammen bauen wie du willst. Ist das verstaendlich geworden?
Use ed once in a while!

alberich
Beiträge: 189
Registriert: 27.12.2019 10:12:24

Re: Zeitdifferenz mit date(1)

Beitrag von alberich » 18.02.2021 17:20:53

Verstanden ja, - und interessant.

Ich habe mir mal alle Code Beispiele in eine Datei gesetzt, in der Codeblöcke ausgeführt werden können. Wenn ich die so vergleiche, muss ich sagen, da hätte ich lange stricken müssen, um die Beispiele mit `date` zusammenzubekommen.
Python ist da eher wie Häkeln. (Wobei ich weder Stricken noch Häklen kann, aber ich stelle mir letzteres leichter vor :wink: )

Noch mal Dank an alle!

PS: Habe noch mal kurz recherchiert, anscheinend ist Häkeln in der Summe schwerer als Stricken.

tobo
Beiträge: 2349
Registriert: 10.12.2008 10:51:41

Re: [Gelöst] Zeitdifferenz mit date(1)

Beitrag von tobo » 19.02.2021 12:35:23

Noch die Darstellung einzig mit date. Beschränkt auf eine dreistellige Tageszahl und für die Zeitspanne eines Jahres:

Code: Alles auswählen

$ d=$(($(date +%s) - $(date -d "2021-01-13 12:00:00" +%s)));date -ud "@$d" +"%j days, %T" 
038 days, 00:31:23

Antworten