计算5分钟的上限

时间:2018-08-30 06:35:00

标签: linux bash date redhat

操作系统: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)

有什么主意我能做到吗?

2 个答案:

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