Bash:将 unix 时间四舍五入到最接近人类可读格式的分钟

Bash: Rounding up unix time to the nearest minute in human readable format

我有一个纪元时间戳列表,如下所示:

1481842799,1481842859,.....

到目前为止,我设法使用 date 命令将这个时间转换为人类可读的格式,如下所示:

date '+%Y%m%d%H%M%S' -d @1481842799
20161215235959

date '+%Y%m%d%H%M%S' -d @1481842859
20161216000059

date '+%Y%m%d%H%M%S' --date='@1481842799'
20161215235959

如何使用 date 命令将这样的时间四舍五入到最接近的分钟,如下所示?:

20161215235959 至 20161216000000、20161216000059 至 20161216000100

尝试了以下但不起作用:

date '+%Y%m%d%H%M%S' --date='@1481842799 + 1 seconds'
date: invalid date `@1481842799 + 1 seconds'

您正在使用 GNU date,从 -d 标志可以看出。如果您打算将一秒增加到 EPOCH 时间,请使用 bash 算术运算符 $(())

执行以下操作
date '+%Y%m%d%H%M%S' -d "@$((1481842799 + 1))"
20161216043000

即使不递增,也可以使用双引号作为

date '+%Y%m%d%H%M%S' -d "@$((1481842799))"
20161216042959

这与

几乎相同
date '+%Y%m%d%H%M%S' -d @1481842799
20161216042959

作为替代建议,要四舍五入到最接近的分钟,您最好加上 59,然后除以并乘以 60 以截断 down 到最接近的分钟,有点像chepner在评论中的建议。

date '+%Y%m%d%H%M%S' -d "@$(( ((1481842799 + 59) / 60) * 60))"
20161216043000

加59而不是60,意思是当原值已经是60的倍数时,不向上取整