Linux:如何将 date() 舍入到最接近的间隔

NoN*_*ame 2 bash date

我想将分钟四舍五入到最接近的 15 分钟间隔,即 00、15、30、45。我目前正在执行以下操作:

echo $(date +'%Y/%m/%d/%H/')$((($(($(date +'%M') / 15))-0)*15))
Run Code Online (Sandbox Code Playgroud)

但在一小时开始的 1-14 分钟之间,我得到“/2021/11/03/21/0”而不是 00。

另外,我不确定这是否是最好的方法。还有其他选择吗?

tsh*_*ono 5

请您尝试以下操作:

mod=$(( 10#$(date +%M) \% 15 ))
date -d "-${mod} minutes" +%Y/%m/%d/%H/%M
Run Code Online (Sandbox Code Playgroud)
  • 该变量mod保存分钟除以 15 后的余数。
  • 然后减去 ,向下舍入到最接近的 15 分钟间隔mod

[编辑]
的联机帮助页crontab说:

命令中的百分号 (%),除非用反斜杠 () 转义,否则将被更改为换行符,并且第一个 % 之后的所有数据都将作为标准输入发送到命令。

如果要在crontab内执行命令,请将命令修改为:

mod=$(( 10#$(date +\%M) \% 15 ))
date -d "-${mod} minutes" +\%Y/\%m/\%d/\%H/\%M
Run Code Online (Sandbox Code Playgroud)

[Edit2]
如果您想将代码嵌入到crontab文件中,请添加一行,如下所示:

0 12 * * * username bash -c 'mod=$(( 10#$(date +\%M) \% 15 )); DATEVAR=$(date -d "-${mod} minutes" +\%Y/\%m/\%d/\%H/\%M); write.sh "$DATEVAR"'
Run Code Online (Sandbox Code Playgroud)
  • 请相应修改执行时间/日期和用户名。
  • 执行 crontab 命令的默认 shell 可能是/bin/sh. 然后您需要显式切换它来/bin/bash执行 bash 命令。
  • % 15我很抱歉在我的上一篇文章中缺少(模运算)前面的反斜杠。

  • @dimo414 以零开头的数字被解释为八进制。示例:“echo $((08))”失败。“10#”前缀清楚地表明基数是 10。 (5认同)