У меня есть сценарий оболочки, который работает в Linux и использует этот вызов, чтобы получить вчерашнюю дату в YYYY-MM-DD
формате:
date -d "1 day ago" '+%Y-%m-%d'
Он работает большую часть времени, но когда скрипт запускался вчера утром, на 2013-03-11 0:35 CDT
него возвращалось "2013-03-09"
вместо "2013-03-10"
.
Предположительно виновато летнее время (которое началось вчера). Я угадываю, как "1 day ago"
реализован способ, он вычитал 24 часа, а раньше 2013-03-11 0:35 CDT
был 24 часа 2013-03-09 23:35 CST
, что привело к результату "2013-03-09"
.
Так что же это хороший DST-безопасный способ получить вчерашнюю дату в bash для Linux?
Ответы:
Я думаю, что это должно работать, независимо от того, как часто и когда вы запускаете это ...
источник
date -d yesterday 13:00 -I
дата под Mac OSX немного отличается.
Вчера
За последнюю неделю
источник
gdate
вcoreutils
пакете homebrew .date
другое.Это также должно работать, но, возможно, это слишком много:
источник
date
которая не поддерживаетyesterday
синтаксис ...Если вы уверены, что скрипт запускается в первые часы дня, вы можете просто сделать
Кстати, если скрипт запускается ежедневно в 00:35 (через crontab?), Вы должны спросить себя, что произойдет, если изменение DST произойдет в этот час; Сценарий не может быть запущен или запущен дважды в некоторых случаях. Современные реализации
cron
являются довольно умны в этом отношении, хотя.источник
ты можешь использовать
чтобы получить дату от 30 дней назад, аналогично вы можете заменить 30 на x количество дней
источник
%Y%m%d
чтобы соответствовать вопросу. Я все равно проголосовал, поскольку это работало должным образом.Здесь решение, которое будет работать с Solaris и AIX.
Управление часовым поясом возможно для смены часов на несколько часов. Из-за перехода на летнее время 24 часа назад может быть сегодня или позавчера.
Вы уверены, что вчера 20 или 30 часов назад. Который из? Ну, самый последний, которого нет сегодня.
Параметр -e, используемый в команде echo, необходим для bash, но не будет работать с ksh. В ksh вы можете использовать ту же команду без флага -e.
Когда ваш скрипт будет использоваться в разных средах, вы можете запустить скрипт с помощью #! / Bin / ksh или #! / Bin / bash. Вы также можете заменить \ n символом новой строки:
источник
Просто используйте
date
и верные секунды:Как вы правильно заметили, многие детали базовых вычислений скрыты, если вы полагаетесь на арифметику английского времени. Например
-d yesterday
, и-d 1 day ago
будет иметь другое поведение.Вместо этого вы можете надежно зависеть от (точно задокументированных) секунд, прошедших с UTC эпохи Unix, и арифметики bash, чтобы получить нужный момент:
Это было указано в другом ответе . Эта форма более переносима на платформах с разными
date
флагами командной строки, не зависит от языка (например, «вчера» или «выше» во французском языке), и, честно говоря (в долгосрочной перспективе) будет легче запомнить, потому что вы знаю это уже. В противном случае вы могли бы продолжать спрашивать себя: "Это было-d 2 hours ago
или-d 2 hour ago
снова?" или "Это-d yesterday
или-d 1 day ago
что я хочу?"). Единственный сложный момент здесь - это@
.Вооружен Башом и ничем иным:
Bash исключительно на bash, вы также можете получить вчерашнее время через встроенную функцию printf:
Так,
или, что эквивалентно с переменной temp (внешняя подоболочка необязательна, но сохраняет переменные среды чистыми).
Примечание: несмотря на то, что на man-странице указано, что ни один аргумент для средства
%()T
форматирования не будет принимать значение по умолчанию-1
, вместо этого я получаю 0 (спасибо, руководство по bash, версия 4.3.48)источник
Чтобы использовать это позже:
источник
Ты можешь использовать:
Или в любое время, которое вы хотите получить, будет восстановлено с помощью bash.
На месяц:
источник
Как этот вопрос помечен удар "DST сейф"
А использование fork для
date
задания задержки подразумевает простой и более эффективный способ использования встроенного чистого bash :Это намного быстрее на более дружественной системе , чем того , чтобы раскошелиться на
date
.Из ударV> = 5.0 , есть новая переменная
$EPOCHSECONDS
источник