Рассчитайте 5-минутный потолок - PullRequest
0 голосов
/ 30 августа 2018

Операционная система: 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 голосов
/ 30 августа 2018

дату GNU можно рассчитать уже. Это объясняется в руководстве в главе « Относительные позиции в строках даты ». Так что вам нужен всего один 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 совпадает с +%H:%M:%S.

0 голосов
/ 30 августа 2018

Вы можете использовать эту функцию для округления:

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