Вычислить разницу в днях (date..)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
tmp13
Сообщения: 986
ОС: openSuse 11.2

Вычислить разницу в днях

Сообщение tmp13 »

Вообщем есть такая идея...
хотелось бы написать скрипт которому ввиде параметров передаётся две даты и он выводит все дни между ними
что-то типа:

Код: Выделить всё

startdate='01.07.2009'
enddate='01.10.2009'
while [ "$currdate" != "$enddate" ]
do
    currdate=startdate+1 день
    echo $currdate
done

думал использовать что-то типа

Код: Выделить всё

date --date="-1 days ago"
начиная со startdate только не очень понимаю как с неё начать.
Возможно надо вычислить разницу в днях от сегодняшней до 01.07.2009 и потом прибавлять типа
date --date="190 days ago"
date --date="189 days ago"
...
и т.д пока не дойду до enddate.

Есть конечно ещё вариант залезть в БД и там сделать
select to_date('01.10.2009','DD.MM.YYYY') - to_date('01.07.2009','DD.MM.YYYY') from dual;
мб так даже проще, но мне кажется не правильно..
хотя если с date это сделать сложно то лучше конечно
Красных бей и белых бей!
Вот вам иерархия!
Я люблю тебя за это, милая моя,
Разудалая, хмельная мать моя – Анархия!
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Вычислить разницу в днях

Сообщение watashiwa_daredeska »

Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: Вычислить разницу в днях

Сообщение allez »

...

$ startdate='2009-07-01'; enddate='2009-08-01'; curdate=$startdate; \ while [ "$curdate" != "$enddate" ]; do \ date --date "$curdate" "+%m.%d.%Y"; curdate=$(date --date "$curdate +1 day" "+%F"); \ done 07.01.2009 07.02.2009 07.03.2009 07.04.2009 07.05.2009 07.06.2009 07.07.2009 07.08.2009 07.09.2009 07.10.2009 07.11.2009 07.12.2009 07.13.2009 07.14.2009 07.15.2009 07.16.2009 07.17.2009 07.18.2009 07.19.2009 07.20.2009 07.21.2009 07.22.2009 07.23.2009 07.24.2009 07.25.2009 07.26.2009 07.27.2009 07.28.2009 07.29.2009 07.30.2009 07.31.2009



P. S. Пока отвечал, watashiwa_daredeska опередил меня. Прошу плагиатором не считать. :)
Спасибо сказали:
Аватара пользователя
tmp13
Сообщения: 986
ОС: openSuse 11.2

Re: Вычислить разницу в днях

Сообщение tmp13 »

как всё просто спасибо всем=))
чёт я не пойму а чего дата везде в виде
%Y-%m-%d
хотелось бы именно
%d.%m.%Y

т.е иначе говоря..
startdate='01.07.2009'
enddate='01.10.2009'

Код: Выделить всё

date -d "01.07.2009" +%d.%m.%Y

date: неверная дата `01.07.2009'

Код: Выделить всё

date -d "2009-07-01" +%d.%m.%Y

01.07.2009
Красных бей и белых бей!
Вот вам иерархия!
Я люблю тебя за это, милая моя,
Разудалая, хмельная мать моя – Анархия!
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Вычислить разницу в днях

Сообщение watashiwa_daredeska »

tmp13 писал(а):
06.07.2010 18:15
чёт я не пойму а чего дата везде в виде
%Y-%m-%d
хотелось бы именно
%d.%m.%Y
Команда date умеет парсить ограниченное число форматов даты (info coreutils date). Можете поставить на входе какой-нибудь фильтр на sed/awk, который будет преобразовывать желаемые форматы в те, которые понимает date. Ну, а на выходе уже и date сможет сгенерить.
Спасибо сказали:
Аватара пользователя
tmp13
Сообщения: 986
ОС: openSuse 11.2

Re: Вычислить разницу в днях

Сообщение tmp13 »

Понял спасибо=)
Красных бей и белых бей!
Вот вам иерархия!
Я люблю тебя за это, милая моя,
Разудалая, хмельная мать моя – Анархия!
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Вычислить разницу в днях

Сообщение Nazyvaemykh »

Если опции date выглядят запутанными (а ИМХО, они действительно порядком сложны), можно все даты переводить в UNIX-время, и оперировать с временем как с обычным числом. Как-то так:

unix_start=$(date -d "$startdate" +%s)
unix_end=$(date -d "enddate" +%s)
day=$(echo 24 *3600|bc)
for d in $(seq $unix_start $unix_end $day); do date -d @"$d" +%X; done
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Вычислить разницу в днях

Сообщение t.t »

Nazyvaemykh писал(а):
06.07.2010 21:04
day=$(echo 24 *3600|bc)
Калькулятор тут явно лишний.

Код: Выделить всё

echo $((24*3600))
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали: