2013-12-19 6 views
8

Мне нужно как-то использовать команду date в bash или другой утилите для печати даты и времени, за 5 минут до и через 5 минут после заданного значения. Например:Bash script/command для печати даты 5 минут до/после

вход:

Thu Dec 19 14:10 

выход:

Thu Dec 19 14:05 Thu Dec 19 14:10 Thu Dec 19 14:15 

Я вижу, что команда date может использоваться, чтобы сделать это на текущую дату/время, это может быть используется с переданным значением, то есть не текущей датой/временем?

ответ

12

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

$ date --date='5 minutes ago'; date; date --date='5 minutes' 
Qui Dez 19 16:09:17 BRST 2013 
Qui Dez 19 16:14:17 BRST 2013 
Qui Dez 19 16:19:17 BRST 2013 

Использовать конкретную дату (например, 1978/01/10).

$ date --date='1978-01-10 + 5 minutes' 
Ter Jan 10 00:05:00 BRT 1978 
+1

И делать это от времени спецификации плаката, 'ISODate = $ (дата --rfc-3339 = секунды -d "Чты дека 19, 14:10"); date -d "$ isodate + 5 минут" ' –

5

С GNU date, вы можете сделать простую форму даты/времени арифметике с аргументом в --date вариант:

$ date --date 'now + 5 minutes' 

С BSD date (по крайней мере, версия, которая поставляется с Mac OS X), опция -v позволяет сделать что-то подобное, но только с текущим временем:

$ date -v +5M 
$ date -v -5M 

В противном случае, вам необходимо выполнить математику явно после преобразования времени в метку времени UNIX (в секундах с 1 января 1970 года):

$ date -r $(($(date +%s) + 300)) # 5 minutes (300 seconds) from now 
$ date -r $(($(date +%s) - 300)) # 5 minutes ago 
3

Если вы используете Баш под Linux, вы можете использовать параметр -d для выполнения дата манипуляции на существующей дата:

  1. Получить время EPOCH для указанной даты:

    EPOCH=$(date -d 'Thu Dec 19 14:10' '+%s') 
    

    Это дает вам время, в секундах, так как ЭПОХИ (обычно 01/01/1970)

  2. Теперь вы можете использовать простую математику, чтобы вычесть или добавить 5 минут (в секундах) до момента EPOCH

    NEW_EPOCH=$(($EPOCH - 300)) 
    

    очевидно, есть 300 секунд в 5 минутах

  3. Теперь преобразовать этот NEW_EPOCH обратно в читаемую дату

    NEW_DATE=$(date -d "1970-01-01 ${NEW_EPOCH} sec") 
    

Учтите, что это работает только в системах unix, которые поддерживают опцию date -d (т.Linux)

0

Если вы хотите сделать это в течение текущего времени +/- 5 минут, и вы используете Bash 4.2 или более поздней версии, вы можете сделать это без внешних инструментов:

$ printf -v now '%(%s)T' 
$ echo "$now" 
1516161094 
$ f='%a %b %d %R' 
$ printf "%($f)T %($f)T %($f)T\n" "$((now-300))" "$now" "$((now+300))" 
Tue Jan 16 22:46 Tue Jan 16 22:51 Tue Jan 16 22:56 

%(datefmt)T форматирования строки printf позволяет печатать строки даты и времени. Если аргумент пропущен (например, здесь) или равен -1, используется текущее время.

%s форматирует время в секундах с эпохи, а -v now сохраняет вывод в now вместо его печати.

f - просто удобная переменная, поэтому мне не нужно повторять строку форматирования для вывода три раза.

Поскольку аргумент для этого использования printf должно быть в секундах с начала эпохи, вы застряли с внешними инструментами для преобразования входной строки как Thu Dec 19 14:10 в этот формат, и вы бы заменить

printf -v now '%(%s)T' 

с, например, любой из

now=$(date '+%s' -d 'Thu Dec 19 14:10')     # GNU date 
now=$(date -j -f '%a %b %d %T' 'Thu Dec 19 14:10' '+%s') # macOS date 
Смежные вопросы