nos*_*nos 15 command-line date
有什么办法可以使用 date 命令或类似命令获取当前的 15 分钟间隔吗?
例如,日期之类的东西%Y.%m.%d %H:%M
会给我2011.02.22 10:19
,我需要2011.02.22 10:15
在从10:15
到的时间跨度内产生的东西10:29
。
jon*_*n_d 17
您可以使用 获取当前的 unix 时间戳date "+%s"
,使用一些简单的数学运算(我的示例在 中bash
)找到当前的四分之一小时,然后使用更好的格式将其打印回来date
:
curdate=`date "+%s"`
curquarter=$(($curdate - ($curdate % (15 * 60))))
date -d"@$curquarter"
Run Code Online (Sandbox Code Playgroud)
@
从时间戳设置当前日期和时间的语法是迄今为止的 GNU 扩展,如果它不适用于您的操作系统,您可以这样做(不要忘记指定 UTC,否则,它不会工作):
date -d"1970-01-01 $curquarter seconds UTC"
Run Code Online (Sandbox Code Playgroud)
下面的方法使得调用date
两次是不必要的。
系统调用的开销可以使“简单”命令比在其本地环境中执行相同操作的 bash 慢 100 倍。
更新简单提一下我上面的评论:“慢 100 倍”。它现在可以读取“慢500倍”......我最近陷入了(不,盲目地走)这个问题。这是链接:构建测试文件的快速方法
eval $(date +Y=%Y\;m=%m\;d=%d\;H=%H\;M=%M)
[[ "$M" < "15" ]] && M=00 # cater for octal clash
M=$(((M/15)*15))
((M==0)) && M=00 # the math returns 0, so make it 00
echo $Y.$m.$d $H:$M
Run Code Online (Sandbox Code Playgroud)
或者
eval $(date +Y=%Y\;m=%m\;d=%d\;H=%H\;M=%M)
if [[ "$M" < "15" ]] ; then M=00
elif [[ "$M" < "30" ]] ; then M=15
elif [[ "$M" < "45" ]] ; then M=30
else M=45
fi
echo $Y.$m.$d $H:$M
Run Code Online (Sandbox Code Playgroud)
两个版本都只会返回
2011.02.23 01:00
2011.02.23 01:15
2011.02.23 01:30
2011.02.23 01:45
Run Code Online (Sandbox Code Playgroud)
这是第一个对所有 60 个值 {00..59} 的 TEST 循环
for X in {00..59} ; ###### TEST
do ###### TEST
eval $(date +Y=%Y\;m=%m\;d=%d\;H=%H\;M=%M)
M=$X ###### TEST
[[ "$M" < "15" ]] && M=00 # cater for octal clash
M=$(((M/15)*15))
((M==0)) && M=00 # the math returns 0, so make it 00
echo $Y.$m.$d $H:$M
done ###### TEST
Run Code Online (Sandbox Code Playgroud)