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
24
demandé sur tokland 2012-08-30 18:49:39

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.

26
répondu choroba 2012-08-30 14:59:23
#!/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
}
65
répondu perreal 2017-09-10 04:04:32

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.

33
répondu BashDevel 2015-02-11 10:07:50

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.

30
répondu ACyclic 2015-04-08 10:58:25

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é.

15
répondu qubodup 2018-07-23 10:10:56

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..

9
répondu eMPee584 2015-08-23 11:25:27

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
}
5
répondu Vaulter 2013-09-08 12:46:14
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
5
répondu user495470 2014-03-26 14:08:46

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
}
3
répondu linuph 2013-09-29 16:56:12

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.

2
répondu Cugel 2016-06-09 15:07:46

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
1
répondu Faron 2016-10-27 10:33:00

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
}
0
répondu splaisan 2018-02-14 12:59:23