开发者

Technique to compute next day's date from a date supplied via an arg?

I'm having some trouble figuring this out.

I have a script that checks a log file that is generated the day after the date specified by the script call. This is because the files fetched for the specified day's data won't be fetched until the day after. And when that cron runs in the morning, the log file will have a timestamp in it's file name for the next day, not the day specified by the arg. I need to keep the arg the same since is standard convention for our group to only specify the day that the data refers to, not the day that it is fetched by the cron job. That date (stored in $NOW in this script) is used quite a bit for other operations.

So right now I'm doing this crazy nested conditional thing (which actually works but I think it is hideous):

#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 + 887开发者_如何学运维0))
        fi
fi

So you can see I did this crazy work around because I couldn't figure out how to use "date" to show the next days date from the one specified. I have a feeling there is some abstract awesome way to do this with "date" but I just don't know about it and can't decipher it from the man page.

I know about "date --date=xx/xx/xxxx" or "date --date=23 days ago" or whatever. I want something more like "date --date=xx/xx/xxxx minus one day" since I think trying to compute out how many days ago it was is just as hard as what I did to iterate it forward a day.

As always, much thanks to any answers. This site rocks the house yo! -Ryan


This should work:

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

It returns:

Sun Feb 21 00:00:00 EST 2010

...which is one day after the given date.


$ 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


You can take a timestamp of a date, add one day worth of seconds to it and dan transform it to date again.

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜