2017-08-04 436 views
0

此代码的用途是打印1小时前的间隔。我有下面的代码,但是具有麻烦从和到日期之间循环Bash循环遍历日期时间+%Y-%m-%d%H:%M格式

to_dt=`date "+%Y-%m-%d %H:%M"` 
from_dt=`date -d "${to_dt} 1 hour ago" "+%Y-%m-%d %H:%M"` 

echo $from_dt $to_dt 

2017-08-04 01:54 2017-08-04 02:54 

while [ "${from_dt}" -lt "${to_dt}" ] 
do 

    from_dt=`date -d "${from_dt} 1 minute" "+%Y-%m-%d %H:%M"` 
    end_dt_min_after=`date -d "${from_dt} 1 minute" "+%Y-%m-%d %H:%M"` 

done 

我得到以下错误

线10:[:2017年8月4日02:01:整数表达预期

预期结果:

2017年8月4日01:55 2017年8月4日02:56

2017年8月4日01:56 2017年8月4日02:57

....

....

是有可能使用,而每个循环期间从日期即递增1分钟到迭代?

回答

1

我已经使用EPOC为简单起见,这里。应该为你的使用案例工作:

#!/bin/sh 

if [ -z $1 ];then 
echo Please pass number of seconds 
exit 1 
fi 

epoc_now=`date "+%s"` 

epoc_after_hour=`expr $epoc_now + $1` 

while [ "${epoc_after_hour}" -gt "${epoc_now}" ] 
do 
     epoc_now=`expr $epoc_now + 60` 
     date -d "@$epoc_now" 
done 
+0

谢谢。我围绕这个使用原因玩耍​​,并能够获得理想的结果 – Dvusrgme

0

-lt运算符期望两个操作数都是整数。

您应该在运行循环之前将日期变量转换为EPOCH秒值。

to_dt=$(date "+%s") 
from_dt=$(date -d "@$to_dt" -d "-1 hour" "+%s") 

while [ "$from_dt" -lt "$to_dt" ]; do 
    # add 1 minute 
    from_dt=$(date -d "@$from_dt" -d "+1 minute" '+%s') 
    echo "inside the loop" 
done 
+0

因某种原因只循环一次,我看到from_dt里面大于to_date。虽然,我们设置from_dt小于to_dt – Dvusrgme

1

我会处理数字时间戳,直到打印时。 所以,你开始:

from_dt=$(($(date +%s -d "1 hour ago"))) 
to_dt=$(($(date +%s))) 

在循环增量from_dt 60每一次,然后打印时间戳可读格式:

echo "$(date -d @$from_dt)" 
+0

谢谢,与@asatsi类似的用例。但是,我喜欢使用“1小时前”而不是减去秒数,因为这可以非常容易地灵活地返回一个月。 – Dvusrgme

相关问题