Как мне получить скрипт даты bash, который возвращает день недели относительно не текущего времени? - PullRequest
8 голосов
/ 09 февраля 2012

Используя дату bash, я могу вернуть день недели относительно текущего времени.

date --d='last Sunday' #Returns date of the Sunday before today

Я также могу заставить его вернуть день относительно другой даты

date --d='02/1/2012 -2 days' #Returns date two days before Feb. 1, 2012

но как мне заставить его возвращать день недели относительно некоторого не текущего времени? Что я хочу сделать, это:

date --d='Sunday before 02/1/2012' #Doesn't work! I want Sunday before Feb. 1

Если возможно, я бы даже хотел иметь возможность цепочки строк, чтобы я мог ссылаться на относительные дни с новой даты:

# Should return 2 days before the Sunday before Feb. 1, 2012
date --d='Sunday before 02/1/2012 - 2 days'

Хотя эта цепочка не так важна. Есть ли какой-нибудь способ для даты bash вернуть день, основанный на относительном дне недели?

Ответы [ 3 ]

9 голосов
/ 09 февраля 2012

Вы можете использовать небольшую числовую арифметику дня:

base="02/1/2012"
feb1_dayofweek=$( date -d $base +%w )
target_dayofweek=0   # sunday
date -d "$base - $(( (7 + feb1_dayofweek - target_dayofweek) % 7 )) days"

результат:

Sun Jan 29 00:00:00 EST 2012
4 голосов
/ 09 февраля 2012

Хорошо, с bash это можно сделать с помощью некоторого цикла (например, получить дату, которую вы хотите использовать в качестве ссылки в переменной в формате Unix% s, чем уменьшить ее с помощью 24 * 60 * 60, чтобы проверить, воскресенье ли это, и распечатать ее.если это правда ...)

Или вы можете настроить что-то вроде этого с помощью awk

 awk -v BASEDATE="2011 02 02" -v DIW="Sun" -v BEF="2"
       'BEGIN { ct=BASEDATE " 00 00 00"
                ct=mktime(ct)
                while (strftime("%a",ct) != DIW) { ct-=24*60*60 }
                ct-=BEF*24*60*60
                print strftime("%Y-%m-%d %a",ct)
              }'

Вы можете увидеть это в действии здесь .Почти.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * I * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * I * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *..

Если вы хотите, вы можете преобразовать вышеупомянутое в datecalc.awk (с помощью скрипта !#/usr/bin/gawk -f, который использует ARGV[n] переменные вместо -v предоставленных, так что вы можете легко вызвать его из ваших скриптов оболочки.

2 голосов
/ 09 февраля 2012

Это довольно легко сделать, если у вас установлено libfaketime .

<code>export LD_PRELOAD=/usr/lib/libfaketime.so.1
$ FAKETIME='2012-02-01 00:00:00' date --d='last sunday'
Sun Jan 29 00:00:00 EST 2012

Вы можете связать его, установив FAKETIME динамически. Это будет грязно, но будет работать:

<code>$ FAKETIME=$(FAKETIME='2012-02-01 00:00:00' date --d="last sunday" '+%Y-%m-%d %H:%M:%S') date --d="-2 days"
Fri Jan 27 00:00:00 EST 2012
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...