我有$的变量I这是一个shell脚本秒钟,我试图将其转换为24小时HH:MM:SS。 这是可能的壳呢?
Answer 1:
这是一个有趣的哈克的方式做你正在寻找什么=)
date -u -d @${i} +"%T"
说明:
- 该
date
程序允许自1970-01-01 00:00:00 UTC您指定的时间,从字符串,在几秒钟内,并将其输出的任何格式指定。 - 该
-u
选项来显示UTC时间,所以也没有因素时区偏移量(因为起始时间从1970年在UTC) - 下面的部分是GNU
date
特异性(Linux的):- 该
-d
部分告诉date
接受来自串的时间信息,而不是使用的now
- 在
@${i}
的部分是你如何告诉date
是$i
以秒为单位
- 该
- 该
+"%T"
是格式化你的输出。 从man date
页:%T time; same as %H:%M:%S
%T time; same as %H:%M:%S
。 由于我们只关心HH:MM:SS
的一部分,这符合!
Answer 2:
另一种方法:算术
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
Answer 3:
该-d
道理也适用于从最新coreutils
只(Linux)的。
在BSD / OS X,使用
date -u -r $i +%T
Answer 4:
这是我在我的网站算法中/脚本助手: http://ram.kossboss.com/seconds-to-split-time-convert/我用这个elogant ALGO从这里: 转换数秒到数小时,分钟,秒
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
Answer 5:
如果$i
代表从纪元在第二某个日期,你可以用它显示
date -u -d @$i +%H:%M:%S
但你似乎假设$i
是一个区间(例如,一些持续时间)不是一个日期,然后我不明白你想要什么。
Answer 6:
我使用的是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)"
Answer 7:
继续@ Daren`s答案,仅仅是明确的:如果你想使用转换时区 , 不使用“U”开关 ,如: date -d @$i +%T
或在某些情况下, date -d @"$i" +%T
。
文章来源: Convert a time span in seconds to formatted time in shell