我有一个$ i的变量,它是一个shell脚本中的秒,我试图将它转换为24 HOUR HH:MM:SS。这可能在shell中吗?
答案 0 :(得分:72)
这是一种有趣的hacky方式来完成您正在寻找的东西=)
date -u -d @${i} +"%T"
<强>解释强>
date
实用程序允许您指定自1970-01-01 00:00:00 UTC以来的字符串时间(以秒为单位),并以您指定的任何格式输出。-u
选项是显示UTC时间,因此它不考虑时区偏移(因为1970年的开始时间是UTC)date
- 特定的(Linux):
-d
部分告诉date
接受来自字符串的时间信息而不是now
@${i}
部分是date
$i
在几秒钟内+"%T"
的说法man date
用于格式化输出。来自%T time; same as %H:%M:%S
页面:HH:MM:SS
。因为我们只关心{{1}}部分,所以这适合!答案 1 :(得分:16)
另一种方法:算术
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
答案 2 :(得分:12)
-d
参数仅适用于coreutils
(Linux)的日期。
在BSD / OS X中,使用
date -u -r $i +%T
答案 3 :(得分:1)
以下是我网站上的算法/脚本助手: http://ram.kossboss.com/seconds-to-split-time-convert/ 我从这里使用了这个elogant algo:Convert seconds to hours, minutes, seconds
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
答案 4 :(得分:0)
如果$i
表示自纪元以来的第二个日期,则可以使用
date -u -d @$i +%H:%M:%S
但你似乎认为$i
是一个间隔(例如某个持续时间)而不是一个日期,然后我不明白你想要什么。
答案 5 :(得分:0)
我使用C shell,就像这样:
Date C
0 a
1 b
2 c
3 d
答案 6 :(得分:0)
继续@Daren的回答,只是为了清楚:
如果您想将转换用于您的时区,请勿使用&#34; u&#34;切换,如:date -d @$i +%T
或某些情况下date -d @"$i" +%T
。