Bash:从给定时间减去10分钟

时间:2010-09-09 09:26:58

标签: bash time

在bash脚本中,如果我有一个代表时间的数字,以hhmmss(或hmmss)的形式,减去10分钟的最佳方法是什么?

即,90000 - > 85000

4 个答案:

答案 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.