Convertir un intervalle de temps en secondes en temps formaté dans l'interpréteur de commandes

j'ai une variable de $i qui est Secondes dans un script shell, et j'essaye de la convertir en hh 24 heures:MM:SS. Est-ce possible dans la coquille?

27
demandé sur mklement0 2012-11-16 22:59:53

7 réponses

un jeu hacky façon de faire exactement ce que vous cherchez =)

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

explication:

  • l'utilitaire date vous permet de spécifier un temps, à partir d'une chaîne, en secondes depuis 1970-01-01 00:00:00 UTC, et de le sortir dans n'importe quel format que vous spécifiez.
  • l'option -u est d'afficher le temps UTC, donc elle ne prend pas en compte les décalages de fuseau horaire (depuis le début temps à partir de 1970 est en TUC)
  • les parties suivantes sont GNU date - spécifique (Linux):
    • la partie -d indique date d'accepter l'information temporelle de la chaîne de caractères au lieu d'utiliser now
    • la partie @${i} est comment vous dites date que $i est en secondes
  • le +"%T" est pour formater votre sortie. À partir de la man date page: %T time; same as %H:%M:%S . Puisque nous ne nous soucions que de la partie HH:MM:SS , cela correspond!
67
répondu sampson-chen 2017-05-04 02:55:04

une autre approche: 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
répondu glenn jackman 2012-11-16 23:16:08

l'argument -d s'applique à la date de coreutils (Linux) seulement.

dans BSD/ OS X, utiliser

date -u -r $i +%T
11
répondu Alan Tam 2014-02-17 06:48:21

Voici mon algo / script helpers sur mon site: http://ram.kossboss.com/seconds-to-split-time-convert / J'ai utilisé cet elogant algo d'ici: Convertissez les secondes en heures, minutes, secondes

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)

exemple de mon deuxième au Jour, Heure, minute, deuxième convertisseur:

# convert seconds to day-hour:min:sec
convertsecs2dhms() {
 ((d=/(60*60*24)))
 ((h=(%(60*60*24))/(60*60)))
 ((m=(%(60*60))/60))
 ((s=%60))
 printf "%02d-%02d:%02d:%02d\n" $d $h $m $s
 # PRETTY OUTPUT: uncomment below printf and comment out above printf if you want prettier output
 # printf "%02dd %02dh %02dm %02ds\n" $d $h $m $s
}
# setting test variables: testing some constant variables & evaluated variables
TIME1="36"
TIME2="1036"
TIME3="91925"
# one way to output results
((TIME4=$TIME3*2)) # 183850
((TIME5=$TIME3*$TIME1)) # 3309300
((TIME6=100*86400+3*3600+40*60+31)) # 8653231 s = 100 days + 3 hours + 40 min + 31 sec
# outputting results: another way to show results (via echo & command substitution with         backticks)
echo $TIME1 - `convertsecs2dhms $TIME1`
echo $TIME2 - `convertsecs2dhms $TIME2`
echo $TIME3 - `convertsecs2dhms $TIME3`
echo $TIME4 - `convertsecs2dhms $TIME4`
echo $TIME5 - `convertsecs2dhms $TIME5`
echo $TIME6 - `convertsecs2dhms $TIME6`

# OUTPUT WOULD BE LIKE THIS (If none pretty printf used): 
# 36 - 00-00:00:36
# 1036 - 00-00:17:16
# 91925 - 01-01:32:05
# 183850 - 02-03:04:10
# 3309300 - 38-07:15:00
# 8653231 - 100-03:40:31
# OUTPUT WOULD BE LIKE THIS (If pretty printf used): 
# 36 - 00d 00h 00m 36s
# 1036 - 00d 00h 17m 16s
# 91925 - 01d 01h 32m 05s
# 183850 - 02d 03h 04m 10s
# 3309300 - 38d 07h 15m 00s
# 1000000000 - 11574d 01h 46m 40s
1
répondu kossboss 2017-05-23 12:17:59

si $i représente une date en seconde 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 certaine durée) pas une date, et alors je ne comprends pas ce que vous voulez.

0
répondu Basile Starynkevitch 2012-11-16 19:26:40

j'utilise le shell C, 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
répondu Shilv 2016-11-24 09:25:34

poursuivant la réponse de @Daren, juste pour être clair: Si vous voulez 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
répondu Shai Alon 2018-02-13 15:02:25