从通过arg提供的日期计算第二天的日期的技术?

时间:2010-02-11 00:44:48

标签: linux bash date scripting cron

我在解决这个问题时遇到了一些麻烦。

我有一个脚本,用于检查在脚本调用指定的日期之后生成的日志文件。这是因为直到第二天才会获取为指定日期数据提取的文件。当cron在早上运行时,日志文件将在第二天的文件名中包含时间戳,而不是arg指定的日期。我需要保持arg相同,因为我们组的标准约定只指定数据引用的日期,而不是cron作业提取的日期。该日期(在此脚本中以$ NOW存储)用于其他操作。

所以现在我正在做这个疯狂的嵌套条件事件(实际上有效,但我觉得它很可怕):

#Setup the date, and variables
TENANT=$1
DATE_ARRAY=(`echo $2 | sed -e 's/\// /g'`)
MONTH=(`echo ${DATE_ARRAY[0]}`)
DAY=(`echo ${DATE_ARRAY[1]}`)
YEAR=(`echo ${DATE_ARRAY[2]}`)
NOW=$YEAR$MONTH$DAY
...

# The next 15 lines or so will iterate the cron log date to the correct
# month or year if the load date is at the end of the month/year.
if [ "$DAY" -eq 28 ] && [ "$MONTH" -eq 02 ]; then
        CRON_NOW=$(($NOW + 173))
elif [ "$DAY" -le 29 ]; then
        CRON_NOW=$(($NOW + 1))
elif [ "$DAY" -eq 30 ]; then
        if [ "$MONTH" -eq 04 ] || [ "$MONTH" -eq 06 ] || [ "$MONTH" -eq 09 ] || [ "$MONTH" -eq 11 ]; then
                CRON_NOW=$(($NOW + 171))
        else
                CRON_NOW=$(($NOW + 1))
        fi
elif [ "$DAY" -eq 31 ]; then
        if [ "$MONTH" -eq 01 ] || [ "$MONTH" -eq 03 ] || [ "$MONTH" -eq 05 ] || [ "$MONTH" -eq 07 ] || [ "$MONTH" -eq 08 ] || [ "$MONTH" -eq 10 ]; then
                CRON_NOW=$(($NOW + 170))
        fi
        if [ "$MONTH" -eq 12 ]; then
                CRON_NOW=$(($NOW + 8870))
        fi
fi

所以你可以看到我做了这个疯狂的工作,因为我无法弄清楚如何使用“日期”来显示指定的日期。我有一种感觉,有一些抽象的令人敬畏的方式与“日期”这样做,但我只是不知道它,不能从手册页解密它。

我知道“date --date = xx / xx / xxxx”或“date --date = 23天前”或其他什么。我想要更像“date --date = xx / xx / xxxx减去一天”之类的东西,因为我想尝试计算出它前几天和我每天迭代前进一样困难。

一如既往,非常感谢任何答案。这个网站晃动房子哟! -Ryan

3 个答案:

答案 0 :(得分:10)

这应该有效:

date --date="20 Feb 2010 1 day"

它返回:

Sun Feb 21 00:00:00 EST 2010

...这是给定日期之后的一天。

答案 1 :(得分:6)

$ date -d 'tomorrow'
Thu Feb 11 18:52:56 CST 2010

$ date -d '3/1/2011 - 1 day'
Mon Feb 28 00:00:00 CST 2011

答案 2 :(得分:1)

您可以获取日期的时间戳,为其添加一天的秒数,并将其再次转换为日期。

date --date=@$(($(date --date=2008-09-04 +%s) + 86400)) +%F