猛击几分钟到5分钟

时间:2014-04-01 10:21:33

标签: bash timestamp

我们有这个字符串以干净的格式检索日期和时间。

 TIMESTAMP= date "+%Y%m%d%H%M"

是否有一些内联代码可以用来将分钟缩小到5分钟。 因此,如果它是12:03,它将使它成为12:00,如果它是12:49,它将是12:45

谢谢!

8 个答案:

答案 0 :(得分:6)

要执行此操作,您可以从总分钟中减去模5的分钟数。打印出来:

echo "$(date "+%Y%m%d%H%M") - ($(date +%M)%5)" | bc

将其保存到变量:

my_var=$(echo "$(date "+%Y%m%d%H%M") - ($(date +%M)%5)" | bc)

这取决于您现在保留的日期格式字符串 - 一串数字。

示例输出:

$ date "+%Y%m%d%H%M"
201404010701
$ echo "$(date "+%Y%m%d%H%M") - ($(date +%M)%5)" | bc
201404010700

答案 1 :(得分:4)

一个小字符串操作:

case $TIMESTAMP in 
    *[1234]) TIMESTAMP=${TIMESTAMP%?}0;; 
    *[6789]) TIMESTAMP=${TIMESTAMP%?}5;; 
esac

${TIMESTAMP%?}删除最后一个字符。参考:http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion

答案 2 :(得分:4)

不完全是bash而是使用dateutils' dround实用程序,它归结为:

$ dround now -5m
2014-04-01T10:35:00

或使用您的格式说明符:

$ dround now -5m -f '%Y%m%d%H%M'
201404011035

免责声明:我是该项目的作者。

答案 3 :(得分:3)

您可以使用整数除法并乘以返回以获得舍入值。

$ m=23
$ (( m /= 5, m *= 5 )) && echo $m
20

整数除法只返回结果的整数部分,所以在上面的情况下返回4.然后乘以5得到20。

在你的情况下:

$ TIMESTAMP=$(date "+%Y%m%d%H%M")
$ echo $TIMESTAMP
201404011231
$ (( TIMESTAMP /= 5, TIMESTAMP *= 5 ))
$ echo $TIMESTAMP
201404011230

$ TIMESTAMP=$(date "+%Y%m%d%H%M")
$ echo $TIMESTAMP
201404011257
$ (( TIMESTAMP /= 5, TIMESTAMP *= 5 ))
$ echo $TIMESTAMP
201404011255

答案 4 :(得分:0)

Fedorqui的解决方案非常智能且用途广泛:

seconds=$(date +%s) 
echo $seconds $(date --date="@$seconds" +%H:%M:%S) # say 1559449650 # 06:27:30
# (( seconds /= 3600, seconds *= 3600 )) # rounds to this hour
# (( seconds += 3600, seconds /= 3600, seconds *= 3600 )) # rounds to next hour
(( seconds += 1800, seconds /= 1800, seconds *= 1800 )) # rounds to next half of a hour
next_hour=$(date --date="@$seconds" +%H:%M:%S)
echo $seconds $next_hour # say 1559449800 06:30:00

答案 5 :(得分:0)

使用余数运算符,我们可以确定多余的分钟数,然后可以将其减去原始分钟数:

TIMESTAMP=$(date "+%Y%m%d%H%M")
(( TIMESTAMP -= TIMESTAMP%5 ))
echo $TIMESTAMP

这只能工作,因为100和60都可以被5整除 如果要用15分钟而不是5分钟,则表达式会更复杂:

(( TIMESTAMP -= TIMESTAMP%100%5 ))

答案 6 :(得分:0)

使用bash:

TIMESTAMP = $(日期“ +%Y%m%d%H%M”)

MINROUND=$((10#${TIMESTAMP:10:2} / 5 * 5))
if [ "${#MINROUND}" = 1 ]; then
  MINROUND="0$MINROUND"
fi
TIMESTAMP="${TIMESTAMP:0:10}${MINROUND}"

答案 7 :(得分:0)

使用 Bash:
跟随一行将分钟舍入到 5 分钟的步长:

d=$(date +'%M'); 
echo $(date +'%d/%m/%Y %H:')$((($(($d / 5))-0)*5))':'$(date +'%M')
output example:
Sat Apr 24 12:16:00 CEST 2021 24/04/2021 12:15:16