views:

54

answers:

3

Hi All,

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 + 8870))
        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

+1  A: 

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
Slartibartfast
Days have different numbers of seconds when they shift to/from Daylight Saving Time.
Dennis Williamson
If exact time is required, this would be a problem, but if hour is set after 3am, you'll always hit next day.
Slartibartfast
+4  A: 
$ 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
Dennis Williamson
Yep that works. Thanks for the reply. :)
SDGuero
+6  A: 

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.

0xfe
Haha awesome! Thanks a lot. i wish tehy had better documentation on the man page. I had a feeling it was something simple like that but everything I tried didn't work. Awesome!!!
SDGuero