操作系统:Red Hat Enterprise Linux Server 7.2(Maipo)
我想将时间四舍五入到最近的5分钟,例如,仅向上而不是向下:
08:09:15应该是08:10:00
08:11:26应该是08:15:00
08:17:58应该是08:20:00
我一直在尝试:
(date -d @$(( (($(date +%s) + 150) / 300) * 300)) "+%H:%M:%S")
这会四舍五入,但也会减少时间(08:11:18将导致08:10:00而不是08:15:00)
有什么主意我能做到吗?
答案 0 :(得分:1)
您可以使用此实用程序功能进行四舍五入:
roundDt() {
local n=300
local str="$1"
date -d @$(( ($(date -d "$str" '+%s') + $n)/$n * $n)) '+%H:%M:%S'
}
然后以以下方式调用此函数:
roundDt '08:09:15'
08:10:00
roundDt '08:11:26'
08:15:00
roundDt '08:17:58'
08:20:00
要跟踪此函数的计算方式,请在导出后使用-x
(跟踪模式):
export -f roundDt
bash -cx "roundDt '08:11:26'"
+ roundDt 08:11:26
+ typeset n=300
+ typeset str=08:11:26
++ date -d 08:11:26 +%s
+ date -d @1535631300 +%H:%M:%S
08:15:00
答案 1 :(得分:1)
GNU日期可以计算出来。在手册的“ Relative items in date strings”一章中对此进行了说明。因此,您只需要一个date
通话。
d=$(date +%T) # get the current time
IFS=: read h m s <<< "$d" # parse it in hours, minutes and seconds
inc=$(( 300 - (m * 60 + s) % 300 )) # calculate the seconds to increment
date -d "$d $inc sec" +%T # output the new time with the offset
顺便说一句:+%T
is the same as +%H:%M:%S
。