Отримати дату (за день до поточного часу) в Bash


171

Як я можу надрукувати дату, що за день до поточного часу в Bash?


Випробувана дата, але, схоже, немає переключення -d у
баші

Я знайшов ще одне чудове рішення, встановивши gnu date (coreutil пакет) від sunfreeware.
конадор

також немає перемикача -d у даті AIX
франкстер

--dateАбо -dопція доступна тільки в даті GNU
Кріс Джонсон FA

Дивіться stackoverflow.com/q/15374752/462865 для безпечної для DST версії цього питання.
Амір Алі Акбарі

Відповіді:


262

якщо у вас є дата GNU, і я правильно вас зрозумів

$ date +%Y:%m:%d -d "yesterday"
2009:11:09

або

$ date +%Y:%m:%d -d "1 day ago"
2009:11:09

1
Я знайшов більшість з них, як пропонується відповідь, але -d перемикач не знайдений у даті
Соларіса

3
Для використання в Ubuntu з функцією дати: $ (дата +% Y:% m:% d -d "1 день тому"), вихід: 2013: 04: 21. І якщо ви хочете дати за 10 днів до цього, ви можете використовувати $ (дата +% Y:% m:% d -d "10 днів тому") або $ (дата +% Y:% m:% d -d "10 день тому ")
zhihong

На OS X можна встановити Coreutils через варіння: см stackoverflow.com/questions/15374752 / ...
kasterma

11
date -v-1dна OSX (мінус), -v+1d(плюс)
bgs

2
Ця функція bash буде працювати як на Linux, так і на OSX. В основному, він спершу приміряє стиль GNU Linux. Якщо це не вдалося, спробуйте стиль OSX. Назвіть це з аргументом кількості днів за минулу, у яку ви хочете побачити. Якщо ви не передаєте жодних аргументів, передбачайте 0 днів. Цей код є однолінійним, тому вирізання та вставка повинні працювати - жодних закінчень рядків не передбачається. date_days_past () { days_past=${1:-0}; if ! date -v-${days_past}d +%Y%m%d 2>/dev/null; then date --date="-${days_past} day" +%Y%m%d; fi }
Ной Спур'єр

50

Якщо у вас є BSD (OSX), dateви можете зробити це так:

date -j -v-1d
Wed Dec 14 15:34:14 CET 2011

Або якщо ви хочете зробити обчислення дати на довільну дату:

date -j -v-1d -f "%Y-%m-%d" "2011-09-01" "+%Y-%m-%d"
2011-08-31

41
date --date='-1 day'

4
Erros на macOS Sierra:date: illegal option -- -
kuanb

2
Вам потрібно встановити версію GNU date, доступну через coreutilsпакет, щоб цей синтаксис працював на macOS. Якщо ви використовуєте Homebrew, ви можете встановити його через brew install coreutils, після чого ви зможете використовувати дату GNU через gdateкоманду. Дивіться: topbug.net/blog/2013/04/14/…
sumitsu

17

MAC OSX

Для вчорашнього побачення:

date -v-1d +%F

де 1d визначає поточний день мінус 1 день. Аналогічно

дата -v-1w +% F - для дати попереднього тижня

дата -v-1m +% F - для дати попереднього місяця

ЯКЩО ВИ ДАТИ ГНУ,

date --date="1 day ago"

Більше інформації: https://www.cyberciti.biz/tips/linux-unix-get-yesterdays-tomorrows-date.html


7

Ну це пізня відповідь, але це, здається, працює !!

     YESTERDAY=`TZ=GMT+24 date +%d-%m-%Y`;
     echo $YESTERDAY;


4

Вибачте, що не згадую, що я в системі Solaris. Таким чином, перемикач -deta не доступний для Solaris bash.

Я дізнаюся, що я можу отримати попередню дату з невеликою хитрістю на часовому поясі.

DATE=`TZ=MYT+16 date +%Y-%m-%d_%r`
echo $DATE

Цей спосіб не є на 100% надійним (фактично близько 98%), якщо вам трапляється жити в приміщенні, використовуючи літній час.
jlliagre

Не точно, ви можете використовувати bash $(TZ=America/New_York date +%Y-%m-%d)
phray2002

3

Можливо, використовувати Perl замість цього, можливо?

perl -e 'print scalar localtime( time - 86400 ) . "\n";'

Або використовувати nawk та (ab) use / usr / bin / adb:

nawk 'BEGIN{printf "0t%d=Y\n", srand()-86400}' | adb

Натрапив на це теж ... божевільно!

/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= '/^time\(\)/ {gsub(/ /,"",$2);printf "0t%d=Y\n", $2-86400}' | adb


1
yesterday=`date -d "-1 day" %F`

Перетворює вчорашню дату у форматі РРРР-ММ-DD у змінну $yesterday.


1
#!/bin/bash
OFFSET=1;
eval `date "+day=%d; month=%m; year=%Y"`
# Subtract offset from day, if it goes below one use 'cal'
# to determine the number of days in the previous month.
day=`expr $day - $OFFSET`
if [ $day -le 0 ] ;then
month=`expr $month - 1`
if [ $month -eq 0 ] ;then
year=`expr $year - 1`
month=12
fi
set `cal $month $year`
xday=${$#}
day=`expr $xday + $day`
fi
echo $year-$month-$day

+1 для виправлення, цікавий метод, навіть якщо це трохи дослівно.
Пітер Ліндквіст

1
Привіт, medoix, я не в змозі знайти значення $ {$ #}. Я знаю, що $ # означає кількість аргументів до сценарію / функції. Але я не в змозі з цим ставитися. Будь ласка, допоможіть.
Karthick S

Це не працює протягом попереднього дня зміни місяця. Наприклад, сьогодні 1 July , 2013, результат роздруковується 2013-6-1347, тоді як очікуваний результат2013-6-30
неправильно керований

Замість 3 рядків між "fi" спробуйте "day = echo $(cal $month $year)|tr ' ' '\n'|tail -n 1"
Антон Рослов

1

Ви можете виконати простий розрахунок із суцільним виразом, якщо обраний формат дати "YYYYMM":

echo $(($(date +"%Y%m") - 1)) | sed -e 's/99$/12/'

У січні 2020 року він поверне 201912 ;-) Але це лише обхідне рішення, коли дата не має варіантів обчислення та інших варіантів інтерпретатора дат (наприклад, за допомогою perl) недоступні ;-)




0

Рішення про DST:

Маніпуляція часовим поясом можлива для зміни годин на кілька годин. Через літній час 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

0

Не дуже сексуально, але може зробити цю роботу:

perl -e 'my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time - 86400);$year += 1900; $mon+= 1; printf ("YESTERDAY: %04d%02d%02d \n", $year, $mon, $mday)'

Сформований з відповіді "мартін глейтон".


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.