日期:获取当前的 15 分钟间隔

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)


Pet*_*r.O 5

下面的方法使得调用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)

  • 只是为了澄清 - “系统调用”是指“fork/exec/wait,如 system() 调用”,而不是一般的_系统调用_。(我提到这一点是因为由于用户/内核切换,进行系统调用也会在程序中产生开销。这不是这里的特殊问题。) (2认同)