ubuntuusers.de

BASH: Zeitwert runden auf volle Sekunden

Status: Gelöst | Ubuntu-Version: Kubuntu 22.04 (Jammy Jellyfish)
Antworten |

michahe

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 857

Geliefert werden mir Zeitwerte, z.B.

MI="01:02:54.598"

Wie kann ich das auf volle Sekunden runden (also nicht einfach abschneiden), um

MI="01:02:55"

zu erhalten?

CarstenHa

Avatar von CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 147

Eine Möglichkeit wäre:

1
MI="01:02:54.598"; printf '%.2d:%.2d:%.0f\n' $(cut -f1 -d: <<<$MI) $(cut -f2 -d: <<<$MI) $(cut -f3 -d: <<<$MI | sed 's/\./,/')

Man könnte das sicherlich auch mit dem Abschneiden von Mustern machen.

Gruß

Carsten

micneu

Avatar von micneu

Anmeldungsdatum:
19. Januar 2021

Beiträge: 834

Wohnort: Hamburg

1. Ist es nur das, was du als ausgangs wert hast? 2. Wie ist es mit der Rundung, wann soll auf und wann abgerundet werden, das wurde hier nicht geschrieben 3. Wenn es ein richtiges Datum + Zeit währe könnte man es versuchen mit:

  • Konvertierung in Unix time

  • Dan runden

  • Rück konvertieren in human time

shiro Team-Icon

Supporter

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1280

Man kann es auch mit "date" bestimmen (wegen 23:59:59.512 und Datumswechsel):

$ MI="01:02:54.598"; date -d@$(($(date -d $MI +%s)+$((${MI#*.}<500?0:1)))) +%X
01:02:55
$ # oder
$ MI="23:59:59.512"; date -d@$(($(date -d $MI +%s)+$((${MI#*.}<500?0:1)))) +%X
00:00:00
$ 

wxpte

Anmeldungsdatum:
20. Januar 2007

Beiträge: 1388

micneu schrieb:

  • Konvertierung in Unix time

  • Dan runden

Schwierig, da bereits die Unixzeit nur über eine Genauigkeit ganzer Sekunden verfügt. Da ist also nichts zum Runden übrig.

CarstenHa

Avatar von CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 147

shiro schrieb:

Man kann es auch mit "date" bestimmen (wegen 23:59:59.512 und Datumswechsel):

$ MI="01:02:54.598"; date -d@$(($(date -d $MI +%s)+$((${MI#*.}<500?0:1)))) +%X
01:02:55
$ # oder
$ MI="23:59:59.512"; date -d@$(($(date -d $MI +%s)+$((${MI#*.}<500?0:1)))) +%X
00:00:00
$ 

Noch besser 👍

CarstenHa

Avatar von CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 147

Ist auch Blödsinn was ich da geschrieben habe, weil es die aufzurundenden Minuten/Stunden nicht mit berücksichtigt. Asche auf mein Haupt 😊

michahe

(Themenstarter)

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 857

Danke shiro

Man kann es auch mit "date" bestimmen (wegen 23:59:59.512 und Datumswechsel):

(Wieder einmal) perfekt!

michahe

(Themenstarter)

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 857

Hallo @shiro

Man kann es auch mit "date" bestimmen (wegen 23:59:59.512 und Datumswechsel):

Leider doch nicht ganz: Bei einigen 100 Dateien finden sich Zeitstempel, deren Millisekunden-Teil mit '0' beginnt:

1
2
3
4
$ echo $MI_Dauer
00:03:36.048
$ MI_Dauer=$(date -d@$(($(date -d $MI_Dauer +%s)+$((${MI_Dauer#*.}<500?0:1)))) +%X)
bash: 048: Der Wert ist für die aktuelle Basis zu groß. (Fehlerverursachendes Zeichen ist "048").

Der Fehler tritt nur auf, wenn der Millisekunden-Teil mit '0' beginnt:

...
test.sh: Zeile 47: 084: Der Wert ist für die aktuelle Basis zu groß. (Fehlerverursachendes Zeichen ist "084").
test.sh: Zeile 47: 089: Der Wert ist für die aktuelle Basis zu groß. (Fehlerverursachendes Zeichen ist "089").
test.sh: Zeile 47: 018: Der Wert ist für die aktuelle Basis zu groß. (Fehlerverursachendes Zeichen ist "018").
test.sh: Zeile 47: 009: Der Wert ist für die aktuelle Basis zu groß. (Fehlerverursachendes Zeichen ist "009").
test.sh: Zeile 47: 018: Der Wert ist für die aktuelle Basis zu groß. (Fehlerverursachendes Zeichen ist "018").
test.sh: Zeile 47: 084: Der Wert ist für die aktuelle Basis zu groß. (Fehlerverursachendes Zeichen ist "084").
test.sh: Zeile 47: 082: Der Wert ist für die aktuelle Basis zu groß. (Fehlerverursachendes Zeichen ist "082").
test.sh: Zeile 47: 068: Der Wert ist für die aktuelle Basis zu groß. (Fehlerverursachendes Zeichen ist "068").
test.sh: Zeile 47: 029: Der Wert ist für die aktuelle Basis zu groß. (Fehlerverursachendes Zeichen ist "029").
test.sh: Zeile 47: 068: Der Wert ist für die aktuelle Basis zu groß. (Fehlerverursachendes Zeichen ist "068").
test.sh: Zeile 47: 084: Der Wert ist für die aktuelle Basis zu groß. (Fehlerverursachendes Zeichen ist "084").
test.sh: Zeile 47: 029: Der Wert ist für die aktuelle Basis zu groß. (Fehlerverursachendes Zeichen ist "029").
test.sh: Zeile 47: 090: Der Wert ist für die aktuelle Basis zu groß. (Fehlerverursachendes Zeichen ist "090").
test.sh: Zeile 47: 083: Der Wert ist für die aktuelle Basis zu groß. (Fehlerverursachendes Zeichen ist "083").
test.sh: Zeile 47: 095: Der Wert ist für die aktuelle Basis zu groß. (Fehlerverursachendes Zeichen ist "095").
test.sh: Zeile 47: 082: Der Wert ist für die aktuelle Basis zu groß. (Fehlerverursachendes Zeichen ist "082").
test.sh: Zeile 47: 048: Der Wert ist für die aktuelle Basis zu groß. (Fehlerverursachendes Zeichen ist "048").
...

fleet_street

Top-Wikiautor
Avatar von fleet_street

Anmeldungsdatum:
30. August 2016

Beiträge: 2400

Wohnort: Hunsrück (dunkle Seite)

Ich hätte die Ausgabe direkt mit date formatiert

... +%H%M%S

Ist halt immer abgerundet.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4695

Wohnort: Berlin

@michahe: Bei führender 0 wird das als Oktalzahl gelesen. Das heisst auch wenn da dann keine Ziffern jenseits von 7 drin vorkommen, gibt es keine Fehlermeldung, aber der Wert wird falsch berechnet.

shiro Team-Icon

Supporter

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1280

Der Fehler tritt nur auf, wenn der Millisekunden-Teil mit '0' beginnt:

Ich bin im Moment leider unterwegs. Das Problem liegt daran, dass eine mit 0 beginnende Zahl als Oktalzahl interpretiert wird und dann auftauchende 8 und 9 Ziffern illegal sind.

Prüfe daher besser auf das Zeichen nach dem Punkt:

echo $(date -d@$(($(date -d $MI_Dauer +%s)+$((${MI_Dauer:9:1}<5?0:1)))) +%X)

Leider kann ich das im Moment nicht prüfen.

wxpte

Anmeldungsdatum:
20. Januar 2007

Beiträge: 1388

fleet_street schrieb:

Ist halt immer abgerundet.

... aber nicht gewollt, sonst wären wir hier längst fertig:

date -d"$MI" +%T

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7790

wxpte schrieb:

... aber nicht gewollt, sonst wären wir hier längst fertig:

date -d"$MI" +%T

oder vielleicht Pi mal Daumen so

date -d"${MI} +0.5 seconds" +%T

wxpte

Anmeldungsdatum:
20. Januar 2007

Beiträge: 1388

Ich wusste gar nicht, dass die Angabe von Sekunden mit der Option -d auch mit Nachkommastellen funktioniert. Dann ist es ja sogar noch einfacher, als die von shiro beschriebene Lösung. 😎

Nachtrag: Das werde ich gleich im Wiki ergänzen. ☺

Antworten |