将时间跨度转换为shell中的格式化时间

我有一个$ i的variables,这是一个shell脚本中的秒,我试图将其转换为24 HOUR:MM:SS。 这是可能的壳?

Solutions Collecting From Web of "将时间跨度转换为shell中的格式化时间"

这是一个有趣的哈克方式来做你正在寻找= =)

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

说明:

  • date实用程序允许您从1970-01-01 00:00:00 UTC开始以秒为单位指定时间,并以您指定的任何格式输出。
  • -u选项是显示UTC时间,所以它不考虑时区偏移量(自1970年的起始时间是UTC)
  • 以下部分是GNU date特定的(Linux):
    • -d部分告诉date接受来自字符串的时间信息而不是now使用
    • @${i}部分是你如何告诉$i在几秒钟内的date
  • +"%T"用于格式化您的输出。 从man date页面: %T time; same as %H:%M:%S %T time; same as %H:%M:%S 。 因为我们只关心HH:MM:SS部分,所以适合!

另一种方法:算术

 i=6789 ((sec=i%60, i/=60, min=i%60, hrs=i/60)) timestamp=$(printf "%d:%02d:%02d" $hrs $min $sec) echo $timestamp 

产生1:53:09

-d参数仅适用于coreutils (Linux)的日期。

在BSD / OS X中,使用

 date -u -r $i +%T 

这里是我的网站上的算法/脚本助手: http: //ram.kossboss.com/seconds-to-split-time-convert/我用这个elogant算法从这里: 转换秒到小时,分钟,秒

 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) 

我第二天,小时,分钟,秒转换器的例子:

 # convert seconds to day-hour:min:sec convertsecs2dhms() { ((d=${1}/(60*60*24))) ((h=(${1}%(60*60*24))/(60*60))) ((m=(${1}%(60*60))/60)) ((s=${1}%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 

我使用C shell,像这样:

 #! /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)" 

如果$i代表自Epoch以来秒数的某个日期,则可以显示它

  date -u -d @$i +%H:%M:%S 

但是你似乎认为$i是一个时间间隔(例如某个持续时间)而不是一个日期,然后我不明白你想要什么。