Convertir des secondes en heures, minutes, secondes
comment convertir les secondes en heures, minutes et secondes?
show_time() {
?????
}
show_time 36 # 00:00:36
show_time 1036 # 00:17:26
show_time 91925 # 25:32:05
12 réponses
j'utilise moi-même la fonction suivante:
function show_time () {
num=
min=0
hour=0
day=0
if((num>59));then
((sec=num%60))
((num=num/60))
if((num>59));then
((min=num%60))
((num=num/60))
if((num>23));then
((hour=num%24))
((day=num/24))
else
((hour=num))
fi
else
((min=num))
fi
else
((sec=num))
fi
echo "$day"d "$hour"h "$min"m "$sec"s
}
notez que cela compte aussi les jours. Aussi, il montre un résultat différent pour votre dernier numéro.
#!/bin/sh
convertsecs() {
((h=/3600))
((m=(%3600)/60))
((s=%60))
printf "%02d:%02d:%02d\n" $h $m $s
}
TIME1="36"
TIME2="1036"
TIME3="91925"
echo $(convertsecs $TIME1)
echo $(convertsecs $TIME2)
echo $(convertsecs $TIME3)
Pour float secondes:
convertsecs() {
h=$(bc <<< "/3600")
m=$(bc <<< "(%3600)/60")
s=$(bc <<< "%60")
printf "%02d:%02d:%05.2f\n" $h $m $s
}
la façon la plus simple que je connaisse:
secs=100000
printf '%dh:%dm:%ds\n' $(($secs/3600)) $(($secs%3600/60)) $(($secs%60))
Note-Si vous voulez des jours alors il suffit d'ajouter une autre unité et diviser par 86400.
date d'utilisation, convertie en UTC:
$ date -d@36 -u +%H:%M:%S
00:00:36
$ date -d@1036 -u +%H:%M:%S
00:17:16
$ date -d@12345 -u +%H:%M:%S
03:25:45
la limite est la boucle des heures à 23, mais cela n'a pas d'importance pour la plupart des cas d'utilisation où vous voulez un one-liner.
simple one-liner
$ secs=236521
$ printf '%dh:%dm:%ds\n' $(($secs/3600)) $(($secs%3600/60)) $(($secs%60))
65h:42m:1s
avec des zéros en tête
$ secs=236521
$ printf '%02dh:%02dm:%02ds\n' $(($secs/3600)) $(($secs%3600/60)) $(($secs%60))
65h:42m:01s
Avec jours
$ secs=236521
$ printf '%dd:%dh:%dm:%ds\n' $(($secs/86400)) $(($secs%86400/3600)) $(($secs%3600/60)) \
$(($secs%60))
2d:17h:42m:1s
avec nanosecondes
$ secs=21218.6474912
$ printf '%02dh:%02dm:%02fs\n' $(echo -e "$secs/3600\n$secs%3600/60\n$secs%60"| bc | xargs echo)
05h:53m:38.647491s
basé sur https://stackoverflow.com/a/28451379/188159 mais edit a été rejeté.
pour nous, paresseux: script prêt à l'emploi disponible à https://github.com/k0smik0/FaCRI/blob/master/fbcmd/bin/displaytime :
#!/bin/bash
function displaytime {
local T=
local D=$((T/60/60/24))
local H=$((T/60/60%24))
local M=$((T/60%60))
local S=$((T%60))
[[ $D > 0 ]] && printf '%d days ' $D
[[ $H > 0 ]] && printf '%d hours ' $H
[[ $M > 0 ]] && printf '%d minutes ' $M
[[ $D > 0 || $H > 0 || $M > 0 ]] && printf 'and '
printf '%d seconds\n' $S
}
displaytime
fondamentalement juste un autre tour sur les autres solutions, mais a le bonus supplémentaire de supprimer les unités de temps vides (F. E. 10 seconds
au lieu de 0 hours 0 minutes 10 seconds
). Ne pouvait pas tout à fait retrouver la source originale de la fonction, se produit dans plusieurs git repos..
Tous les ci-dessus est pour bash, en faisant abstraction de là "#!/ bin / sh" sans aucun bashisme sera:
convertsecs() {
h=`expr / 3600`
m=`expr % 3600 / 60`
s=`expr % 60`
printf "%02d:%02d:%02d\n" $h $m $s
}
t=12345;printf %02d:%02d:%02d\n $((t/3600)) $((t%3600/60)) $((t%60)) # POSIX
echo 12345|awk '{printf "%02d:%02d:%02d","151900920"/3600,"151900920"%3600/60,"151900920"%60}' # POSIX awk
date -d @12345 +%T # GNU date
date -r 12345 +%T # OS X's date
si d'autres cherchaient à savoir comment faire l'inverse:
IFS=: read h m s<<<03:25:45;echo $((h*3600+m*60+s)) # POSIX
echo 03:25:45|awk -F: '{print 3600*+60*+}' # POSIX awk
Je n'ai pas pu obtenir le code de Vaulter/chepner pour fonctionner correctement. Je pense que le code correct est:
convertsecs() {
h=$((/3600))
m=$(((/60)%60))
s=$((%60))
printf "02d:%02d:%02d\n $h $m $s
}
sur une ligne:
show_time () {
if [ -lt 86400 ]; then
date -d@ -u '+%Hh:%Mmn:%Ss';
else
echo "$((/86400)) days $(date -d@$((%86400)) -u '+%Hh:%Mmn:%Ss')" ;
fi
}
Ajouter des jours s'il existe.
c'est le vieux post ovbioius -- mais, pour ceux qui pourraient être à la recherche du temps réel écoulé mais dans le format militaire (00:05:15:22 - au lieu de 0:5:15:22 )
!#/bin/bash
num=
min=0
hour=0
day=0
if((num>59));then
((sec=num%60))
((num=num/60))
if((num>59));then
((min=num%60))
((num=num/60))
if((num>23));then
((hour=num%24))
((day=num/24))
else
((hour=num))
fi
else
((min=num))
fi
else
((sec=num))
fi
day=`seq -w 00 $day | tail -n 1`
hour=`seq -w 00 $hour | tail -n 1`
min=`seq -w 00 $min | tail -n 1`
sec=`seq -w 00 $sec | tail -n 1`
printf "$day:$hour:$min:$sec"
exit 0
on MacOSX 10.13 Modifier légèrement le code de @eMPee584 pour obtenir tout en une seule fois (mettre la fonction dans certains .bashrc comme source et fichier, l'utiliser comme myuptime. Pour les OS Non-Mac, remplacer la formule T par une qui donne les secondes depuis le dernier démarrage.
myuptime ()
{
local T=$(($(date +%s)-$(sysctl -n kern.boottime | awk '{print }' | sed 's/,//g')));
local D=$((T/60/60/24));
local H=$((T/60/60%24));
local M=$((T/60%60));
local S=$((T%60));
printf '%s' "UpTime: ";
[[ $D > 0 ]] && printf '%d days ' $D;
[[ $H > 0 ]] && printf '%d hours ' $H;
[[ $M > 0 ]] && printf '%d minutes ' $M;
[[ $D > 0 || $H > 0 || $M > 0 ]] && printf '%d seconds\n' $S
}