J'ai une variable de $ i qui est secondes dans un script Shell, et j'essaye de le convertir en 24 HOUR HH: MM: SS. Est-ce possible en shell?
Voici une façon amusante de faire exactement ce que vous recherchez =)
date -u -d @${i} +"%T"
Explication:
date
vous permet de spécifier une heure, à partir de chaîne, en secondes depuis le 1970-01-01 00:00:00 UTC et de l'afficher dans le format que vous spécifiez.-u
permet d'afficher l'heure UTC. Elle ne prend donc pas en compte les décalages de fuseau horaire (car l'heure de début à partir de 1970 est l'heure UTC).date
(Linux): -d
indique à date
d'accepter les informations de temps de la chaîne au lieu d'utiliser now
@${i}
indique comment date
indique que $i
est en secondes+"%T"
sert à formater votre sortie. De la page man date
: %T time; same as %H:%M:%S
. Puisque nous ne nous soucions que de la partie HH:MM:SS
, cela convient!Une autre approche: l'arithmétique
i=6789
((sec=i%60, i/=60, min=i%60, hrs=i/60))
timestamp=$(printf "%d:%02d:%02d" $hrs $min $sec)
echo $timestamp
produit 1:53:09
L'argument -d
s'applique uniquement à la date de coreutils
(Linux).
Sous BSD/OS X, utilisez
date -u -r $i +%T
Si $i
représente une date en secondes depuis l’époque, vous pouvez l’afficher avec
date -u -d @$i +%H:%M:%S
mais vous semblez supposer que $i
est un intervalle (par exemple, une durée) et non une date, et je ne comprends pas ce que vous voulez.
J'utilise C Shell, comme ceci:
#! /bin/csh -f
set begDate_r = `date +%s`
set endDate_r = `date +%s`
set secs = `echo "$endDate_r - $begDate_r" | bc`
set h = `echo $secs/3600 | bc`
set m = `echo "$secs/60 - 60*$h" | bc`
set s = `echo $secs%60 | bc`
echo "Formatted Time: $h HOUR(s) - $m MIN(s) - $s SEC(s)"
Poursuivant la réponse de @ Daren, pour clarifier les choses: Si vous souhaitez utiliser la conversion en votre fuseau horaire , n'utilisez pas le commutateur "u" , comme dans: date -d @$i +%T
ou dans certains cas, date -d @"$i" +%T
.