在bash脚本中,如果我有一个代表时间的数字,以hhmmss(或hmmss)的形式,减去10分钟的最佳方法是什么?
即,90000 - > 85000
答案 0 :(得分:20)
这有点棘手。日期可以进行一般操作,即你可以这样做:
date --date '-10 min'
指定小时 - 分 - 秒(使用UTC,否则它似乎假设PM):
date --date '11:45:30 UTC -10 min'
要分割日期字符串,我能想到的唯一方法是子字符串扩展:
a=114530
date --date "${a:0:2}:${a:2:2}:${a:4:2} UTC -10 min"
如果你想回到hhmmss:
date +%H%M%S --date "${a:0:2}:${a:2:2}:${a:4:2} UTC -10 min"
答案 1 :(得分:2)
为什么不只使用纪元时间再拿掉600呢?
$ echo "`date +%s` - 600"| bc; date
1284050588
Thu Sep 9 11:53:08 CDT 2010
$ date -d '1970-01-01 UTC 1284050588 seconds' +"%Y-%m-%d %T %z"
2010-09-09 11:43:08 -0500
答案 2 :(得分:1)
由于你有一个5 或 6位数字,你必须在进行字符串操作之前填充它:
$ t=90100
$ while [ ${#t} -lt 6 ]; do t=0$t; done
$ echo $t
090100
$ date +%H%M%S --utc -d"today ${t:0:2}:${t:2:2}:${t:4:2} UTC - 10 minutes"
085100
请注意,需要使用--utc和UTC来确保系统的时区不会影响结果。
对于bash中的数学运算(即$((
和((
),前导零将导致数字被解释为八进制。但是,无论如何,您的数据更像字符串(使用特殊格式)而不是数字。我上面使用了一个while循环,因为它听起来像是将它视为一个数字,因此可能在12:01 am得到100。
答案 3 :(得分:1)
我的bash版本不支持上面使用的-d或--date。但是,假设正确的0填充输入,这确实有效
$ input_time=130503 # meaning "1:05:03 PM"
# next line calculates epoch seconds for today's date at stated time
$ epoch_seconds=$(date -jf '%H%M%S' $input_time '+%s')
# the 600 matches the OP's "subtract 10 minutes" spec. Note: Still relative to "today"
$ calculated_seconds=$(( epoch_seconds - 600 )) # bc would work here but $((...)) is builtin
# +%H%M%S formats the result same as input, but you can do what you like here
$ echo $(date -r $calculated_seconds '+%H%M%S')
# output is 125503: Note that the hour rolled back as expected.