Техника для вычисления даты следующего дня от даты, представленной через arg? - PullRequest
2 голосов
/ 11 февраля 2010

У меня возникли проблемы с выяснением этого.

У меня есть сценарий, который проверяет файл журнала, который создается на следующий день после даты, указанной в вызове сценария. Это связано с тем, что файлы, выбранные для данных за указанный день, не будут выбраны до следующего дня. И когда этот cron запускается утром, у файла журнала будет временная метка в имени файла на следующий день, а не в день, указанный аргументом 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 days ago" или о чем угодно. Я хочу что-то более похожее на «date --date = xx / xx / xxxx минус один день», так как я думаю, что пытаться вычислить, сколько дней назад это было, так же сложно, как и то, что я сделал, чтобы повторить это на следующий день.

Как всегда, большое спасибо за любые ответы. Этот сайт качает дом йо! -Ryan

Ответы [ 3 ]

10 голосов
/ 11 февраля 2010

Это должно работать:

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

Возвращает:

Sun Feb 21 00:00:00 EST 2010

... это один день после указанной даты.

6 голосов
/ 11 февраля 2010
$ 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
1 голос
/ 11 февраля 2010

Вы можете взять временную метку даты, добавить к ней значение одного дня в секундах и перевести ее в дату снова.

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