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

Posted

技术标签:

【中文标题】Bash:以人类可读格式将 unix 时间四舍五入到最接近的分钟【英文标题】:Bash: Rounding up unix time to the nearest minute in human readable format 【发布时间】:2017-05-06 17:40:33 【问题描述】:

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

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'

【问题讨论】:

你知道所有的时间戳都对应59秒的时间,所以四舍五入就像加一秒一样简单吗? (例外:您需要考虑闰秒吗?)或者第二个字段可以具有任意值并且您实际上需要四舍五入到下一分钟? 我尝试增加 1 秒,但如您所见,我无法使用 date 命令完成。 如果我有任意一秒的时间,也知道如何四舍五入会很好。不确定 date 命令是否支持此类功能。 @Inian,是的! 【参考方案1】:

您正在使用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 以将 向下 截断到最接近的分钟,有点像 chepner在 cmets 中的建议。

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

加上59而不是60,表示当原值已经是60的倍数时,不再四舍五入。

【讨论】:

以上是关于Bash:以人类可读格式将 unix 时间四舍五入到最接近的分钟的主要内容,如果未能解决你的问题,请参考以下文章

将 Epoch 时间戳转换为 sql server(人类可读格式)

以人类可读格式转换纪元时间

使用 Moment.js 将人类可读时间转换为 Unix 纪元时间

如何以人类可读的格式输出(到日志)多级数组?

将 unix 时间转换为 pandas 数据框中的可读日期

将带有单位的数字转换为非人类可读格式