2013-03-13 2 views
95

У меня есть скрипт, который работает на Linux и использует этот вызов, чтобы получить вчерашнюю дату в YYYY-MM-DD формате:Получить вчерашнюю дату в Баш на Linux, ДСТ-безопасной

date -d "1 day ago" '+%Y-%m-%d' 

Он работает большую часть времени, но когда сценарий запускался вчера утром в 2013-03-11 0:35 CDT, он вернул "2013-03-09" вместо "2013-03-10".

Предположительно, летнее время (которое началось вчера) виновато. Я предполагаю, что путь "1 day ago" реализован он вычитал 24 часа, а за 24 часа до 2013-03-11 0:35 CDT был 2013-03-09 23:35 CST, что привело к результату "2013-03-09".

Итак, что хорошего DST-безопасного способа получить вчерашнюю дату в bash на Linux?

+0

Вы всегда одновременно запуская это, вы используете его повторно? – tink

+0

@tink он работает ежедневно в 00:35 –

+0

Возможный дубликат [Получить дату (за день до текущего времени) в Bash] (http://stackoverflow.com/questions/1706882/get-the-date-a-day -before-current-time-in-bash) – shgnInc

ответ

159

Я думаю, что это должно работать, независимо от того, как часто и когда вы запустите его ...

date -d "yesterday 13:00" '+%Y-%m-%d' 
+4

+1, простой и умный – slezica

+0

Как бы вы назначили это переменной для использования позже? – null

+3

@null - таким же образом вы назначили вывод любой другой команды оболочки. variable = $ (date -d "вчера 13:00" +% Y-% m-% d ') ... – tink

7

Это также должно работать, но, возможно, это слишком много:

date -d @$(($(date +"%s") - 86400)) +"%Y-%m-%d" 
+0

+1 также умный, но, увы, не simple haha ​​ – slezica

+0

Такие вещи нужны, если вам нужно иметь дело с Mac OS X 'date', который не поддерживает синтаксис' вчера' ... –

3

Если вы уверены, что скрипт запускается в первые часы дня, вы можете просто сделать

date -d "12 hours ago" '+%Y-%m-%d' 

BTW, если скрипт работает Dail y в 00:35 (через crontab?) вы должны спросить себя, что произойдет, если в этот час произойдет переход на летнее время; сценарий не мог работать или запускаться дважды в некоторых случаях. Однако современные реализации cron - это quite clever.

2

Вот решение, которое будет работать с Solaris и AIX.

Управление часовым поясом возможно для изменения часов в несколько часов. Из-за летнего времени, 24 часа назад может быть сегодня или позавчера.

Вы уверены, что вчера 20 или 30 часов назад. Который из? Ну, последнее, что не сегодня.

echo -e "$(TZ=GMT+30 date +%Y-%m-%d)\n$(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1 

Параметр -e, используемый в команде echo, необходим с bash, но не будет работать с ksh. В ksh вы можете использовать ту же команду без флага -e.

Когда ваш скрипт будет использоваться в разных средах, вы можете запустить скрипт с помощью #!/Bin/ksh или #!/Bin/bash. Вы также можете заменить \ n на новую строку:

echo "$(TZ=GMT+30 date +%Y-%m-%d) 
$(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1 
33

Bash под Mac OSX немного отличается.

За вчера

echo `date -v-1d +%F` 

За последнюю неделю

echo `date -v-1w +%F` 
+6

Если вы заинтересованы в использовании стиля GNU в OSX, вы также можете использовать 'gdate' , доступный в пакете 'coreutils' homebrew. – user456584

+6

Вы имеете в виду, что «дата» отличается. – augurar

2

вы можете использовать

date -d "30 days ago" +"%d/%m/%Y" 

, чтобы получить дату от 30 дней назад, так же вы можете заменить 30 с х суммы дней

Смежные вопросы