web-dev-qa-db-fra.com

Convertir un intervalle de temps en secondes en heure formatée en shell

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?

27
Darren

Voici une façon amusante de faire exactement ce que vous recherchez =)

date -u -d @${i} +"%T"

Explication:

  • L'utilitaire 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.
  • L'option -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).
  • Les parties suivantes sont spécifiques à GNU date (Linux):
    • La partie -d indique à date d'accepter les informations de temps de la chaîne au lieu d'utiliser now
    • La partie @${i} indique comment date indique que $i est en secondes
  • Le +"%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!
70
sampson-chen

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

14
glenn jackman

L'argument -d s'applique uniquement à la date de coreutils (Linux).

Sous BSD/OS X, utilisez

date -u -r $i +%T
11
Alan Tam

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.

0

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)"
0
Shilv

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.

0
Shai Alon