segundos minutos horas cómo convertir como bash

bash - cómo - Convertir segundos a horas, minutos, segundos



convertir segundos a horas minutos y segundos excel (12)

¿Cómo puedo convertir segundos a horas, minutos y segundos?

show_time() { ????? } show_time 36 # 00:00:36 show_time 1036 # 00:17:26 show_time 91925 # 25:32:05


Simple de una sola línea

$ secs=236521 $ printf ''%dh:%dm:%ds/n'' $(($secs/3600)) $(($secs%3600/60)) $(($secs%60)) 65h:42m:1s

Con ceros iniciales.

$ secs=236521 $ printf ''%02dh:%02dm:%02ds/n'' $(($secs/3600)) $(($secs%3600/60)) $(($secs%60)) 65h:42m:01s

Con dias

$ secs=236521 $ printf ''%dd:%dh:%dm:%ds/n'' $(($secs/86400)) $(($secs%86400/3600)) $(($secs%3600/60)) / $(($secs%60)) 2d:17h:42m:1s

Con nanosegundos

$ 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

Basado en https://.com/a/28451379/188159 pero la edición se rechazó.


En una línea:

show_time () { if [ $1 -lt 86400 ]; then date -d@${1} -u ''+%Hh:%Mmn:%Ss''; else echo "$(($1/86400)) days $(date -d@$(($1%86400)) -u ''+%Hh:%Mmn:%Ss'')" ; fi }

Añadir días si existen.


Este es un mensaje antiguo, pero para aquellos que podrían estar buscando el tiempo real transcurrido pero en formato militar (00: 05: 15: 22 - en lugar de 0: 5: 15: 22)

!#/bin/bash num=$1 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


Fecha de uso, convertida a 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 limitación es que las horas pasarán a las 23, pero eso no importa para la mayoría de los casos de uso en los que desea una sola línea.


La forma más sencilla que conozco:

secs=100000 printf ''%dh:%dm:%ds/n'' $(($secs/3600)) $(($secs%3600/60)) $(($secs%60))

Nota: si desea días, simplemente agregue otra unidad y divida por 86400.


No pude hacer que el código de Vaulter / chepner funcionara correctamente. Creo que el código correcto es:

convertsecs() { h=$(($1/3600)) m=$((($1/60)%60)) s=$(($1%60)) printf "02d:%02d:%02d/n $h $m $s }


Para nosotros, gente perezosa: script listo para usar disponible en https://github.com/k0smik0/FaCRI/blob/master/fbcmd/bin/displaytime :

#!/bin/bash function displaytime { local T=$1 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 $1

Básicamente, solo otro giro en las otras soluciones, pero tiene la ventaja adicional de suprimir las unidades de tiempo vacías (fe 10 seconds lugar de 0 hours 0 minutes 10 seconds ). No se pudo rastrear la fuente original de la función, ocurre en varios repositorios de git.


Todo lo anterior es para bash, sin tener en cuenta que "#! / Bin / sh" sin ningún tipo de bashismo será:

convertsecs() { h=`expr $1 / 3600` m=`expr $1 % 3600 / 60` s=`expr $1 % 60` printf "%02d:%02d:%02d/n" $h $m $s }


Yo uso la siguiente función yo mismo:

function show_time () { num=$1 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 }

Tenga en cuenta que también cuenta días. Además, muestra un resultado diferente para su último número.


en MacOSX 10.13 edite ligeramente desde el código de @ eMPee584 para obtenerlo todo en un GO (coloque la función en algún archivo. Da los segundos desde el último arranque.

myuptime () { local T=$(($(date +%s)-$(sysctl -n kern.boottime | awk ''{print $4}'' | 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 }


t=12345;printf %02d:%02d:%02d//n $((t/3600)) $((t%3600/60)) $((t%60)) # POSIX echo 12345|awk ''{printf "%02d:%02d:%02d",$0/3600,$0%3600/60,$0%60}'' # POSIX awk date -d @12345 +%T # GNU date date -r 12345 +%T # OS X''s date

Si otros estuvieran buscando cómo hacer lo contrario:

IFS=: read h m s<<<03:25:45;echo $((h*3600+m*60+s)) # POSIX echo 03:25:45|awk -F: ''{print 3600*$1+60*$2+$3}'' # POSIX awk


#!/bin/sh convertsecs() { ((h=${1}/3600)) ((m=(${1}%3600)/60)) ((s=${1}%60)) printf "%02d:%02d:%02d/n" $h $m $s } TIME1="36" TIME2="1036" TIME3="91925" echo $(convertsecs $TIME1) echo $(convertsecs $TIME2) echo $(convertsecs $TIME3)

Para flotar segundos:

convertsecs() { h=$(bc <<< "${1}/3600") m=$(bc <<< "(${1}%3600)/60") s=$(bc <<< "${1}%60") printf "%02d:%02d:%05.2f/n" $h $m $s }