Как увеличить дату?

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

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

Cetary
Сообщения: 21
ОС: Debian

Как увеличить дату?

Сообщение Cetary »

Например у меня в одной переменной сохранена дата в формате дд/мм/гггг, теперь мне надо в другую переменную записать теже данные, только прибавив скажем 15 дней. Как это можно грамотно сделать, что бы при необходимости менялся и месяц и год?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: Как увеличить дату?

Сообщение /dev/random »

Cetary писал(а):
20.05.2010 14:00
Например у меня в одной переменной сохранена дата в формате дд/мм/гггг

Сначала преобразовать в стандартный формат. Например, YYYY-MM-DD. Чтобы от локали не зависело.

Cetary писал(а):
20.05.2010 14:00
теперь мне надо в другую переменную записать теже данные, только прибавив скажем 15 дней. Как это можно грамотно сделать, что бы при необходимости менялся и месяц и год?

$ date +%Y-%m-%d -d '2010-05-12 + 21 days'
2010-06-02
Спасибо сказали:
Cetary
Сообщения: 21
ОС: Debian

Re: Как увеличить дату?

Сообщение Cetary »

Про формат ясно, спасибо. А вот то что ниже я совсем не понял, каким образом к date придавляется 21 день?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: Как увеличить дату?

Сообщение /dev/random »

Cetary писал(а):
20.05.2010 14:26
Про формат ясно, спасибо. А вот то что ниже я совсем не понял, каким образом к date придавляется 21 день?

Shell

$ D='2010-05-12' $ add=21 $ D=`date +%Y-%m-%d "$D + $add days"` $ echo $D 2010-06-02 $ _
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Как увеличить дату?

Сообщение sash-kan »

Cetary писал(а):
20.05.2010 14:26
каким образом к date придавляется 21 день?
программой date прибавляется.

документация:
$ info date

а реализацию смотрите в исходниках программы.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Как увеличить дату?

Сообщение drBatty »

Cetary писал(а):
20.05.2010 14:00
только прибавив скажем 15 дней. Как это можно грамотно сделать, что бы при необходимости менялся и месяц и год?

я предпочитаю перевести в формат
%s seconds since 1970-01-01 00:00:00 UTC
потом прибавить/отнять нужное, а потом перевести обратно.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Как увеличить дату?

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

drBatty писал(а):
20.05.2010 19:37
Cetary писал(а):
20.05.2010 14:00
только прибавив скажем 15 дней. Как это можно грамотно сделать, что бы при необходимости менялся и месяц и год?
я предпочитаю перевести в формат
%s seconds since 1970-01-01 00:00:00 UTC
потом прибавить/отнять нужное, а потом перевести обратно.
Зачем лишние движения?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Как увеличить дату?

Сообщение drBatty »

t.t писал(а):
20.05.2010 21:19
Зачем лишние движения?

как обычно - это более универсальный способ. и более простой - ИМХО.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Как увеличить дату?

Сообщение sash-kan »

drBatty писал(а):
21.05.2010 01:16
более универсальный способ
ой ли?
что раньше в /bin/date появилось? словесное выражение времени или то ли опция то ли команда „@“?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Как увеличить дату?

Сообщение drBatty »

sash-kan писал(а):
21.05.2010 01:56
что раньше в /bin/date появилось? словесное выражение времени или то ли опция то ли команда „@“?

для меня 1274394332 более просто. если потом это нужно складывать или вычитать. ИМХО.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Как увеличить дату?

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

drBatty писал(а):
21.05.2010 02:28
sash-kan писал(а):
21.05.2010 01:56
что раньше в /bin/date появилось? словесное выражение времени или то ли опция то ли команда „@“?
для меня 1274394332 более просто. если потом это нужно складывать или вычитать. ИМХО.
То для Вас, а не для date. И, с другой стороны, что проще: "21 days" или "21*24*60*60"? (;
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Как увеличить дату?

Сообщение drBatty »

t.t писал(а):
21.05.2010 10:53
То для Вас, а не для date.


может и так. я вообще стараюсь, что-бы мой код был более понятен для меня.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Как увеличить дату?

Сообщение sash-kan »

drBatty
ну да, в принципе, зависит от конечной цели.
если нужно получить дату (в каком-либо даже произвольном формате), а не цифры, то, imho, словесное выражение, понимаемое /bin/date-ом — самое то.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Как увеличить дату?

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

drBatty писал(а):
21.05.2010 11:02
t.t писал(а):
21.05.2010 10:53
То для Вас, а не для date.
может и так. я вообще стараюсь, что-бы мой код был более понятен для меня.
Т.е. для Вас запись "date -d @$(( $(date +%s)+21*24*60*60 ))" понятнее, чем "date -d +21days"? Однако...
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Как увеличить дату?

Сообщение drBatty »

t.t писал(а):
21.05.2010 11:38
Т.е. для Вас запись "date -d @$(( $(date +%s)+21*24*60*60 ))" понятнее, чем "date -d +21days"? Однако...

конечно понятнее! тут речь идёт о секундах. А вот в альтернативном примере есть некие days, да и вообще непонятна сама запись 21days - ИМХО тут * пропущена, между 21 и константой days.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Как увеличить дату?

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

Не совсем понимаю, почему только секунды -- нечто само собой разумеещееся, а дни это "некие days". Впрочем после фразы "конечно понятнее!" диалог можно и не продолжать: мы всё равно друг друга не поймём.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Cetary
Сообщения: 21
ОС: Debian

Re: Как увеличить дату?

Сообщение Cetary »

drBatty писал(а):
20.05.2010 19:37
Cetary писал(а):
20.05.2010 14:00
только прибавив скажем 15 дней. Как это можно грамотно сделать, что бы при необходимости менялся и месяц и год?

я предпочитаю перевести в формат
%s seconds since 1970-01-01 00:00:00 UTC
потом прибавить/отнять нужное, а потом перевести обратно.

Вот таким макаром у меня вышло, а с date так и не разобрался. Напишите пожалуйста готовый пример, где к дате с одной переменной прибавляется 15 дней, а потом результат сохраняется в другой переменной, а то хоть убей не получается.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: Как увеличить дату?

Сообщение /dev/random »

Cetary писал(а):
24.05.2010 14:53
Вот таким макаром у меня вышло, а с date так и не разобрался. Напишите пожалуйста готовый пример, где к дате с одной переменной прибавляется 15 дней, а потом результат сохраняется в другой переменной, а то хоть убей не получается.

Уже привёл. См. большой чёрный блок выше. Только замените 21 на 15, там 21 день прибавляется.
Спасибо сказали:
Cetary
Сообщения: 21
ОС: Debian

Re: Как увеличить дату?

Сообщение Cetary »

/dev/random писал(а):
24.05.2010 15:00
Cetary писал(а):
24.05.2010 14:53
Вот таким макаром у меня вышло, а с date так и не разобрался. Напишите пожалуйста готовый пример, где к дате с одной переменной прибавляется 15 дней, а потом результат сохраняется в другой переменной, а то хоть убей не получается.

Уже привёл. См. большой чёрный блок выше. Только замените 21 на 15, там 21 день прибавляется.

Извиняюсь, и правда, все работает, только формат почему-то 10-05-25, а не 2010-05-25, нельзя исправить?
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Как увеличить дату?

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

Cetary писал(а):
25.05.2010 02:28
/dev/random писал(а):
24.05.2010 15:00
Cetary писал(а):
24.05.2010 14:53
Вот таким макаром у меня вышло, а с date так и не разобрался. Напишите пожалуйста готовый пример, где к дате с одной переменной прибавляется 15 дней, а потом результат сохраняется в другой переменной, а то хоть убей не получается.
Уже привёл. См. большой чёрный блок выше. Только замените 21 на 15, там 21 день прибавляется.
Извиняюсь, и правда, все работает, только формат почему-то 10-05-25, а не 2010-05-25, нельзя исправить?
Чтобы исправить, хорошо бы понять, что исправлять. Потому как приведенный вариант должен и так выводить правильно:

Shell

$ date +%Y-%m-%d 2010-05-25
Что вводите и что получаете на выходе? Скопируйте сюда.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Cetary
Сообщения: 21
ОС: Debian

Re: Как увеличить дату?

Сообщение Cetary »

Вот код, на выходе дата в формате 10-05-25

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

var1=`date +%y-%m-%d'
add=15
var2=`date +%y-%m-%d -d "$var1 + $add days"`

Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Как увеличить дату?

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

Вы разве не видите, что в приведенном примере буква Y заглавная?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Cetary
Сообщения: 21
ОС: Debian

Re: Как увеличить дату?

Сообщение Cetary »

t.t писал(а):
25.05.2010 13:09
Вы разве не видите, что в приведенном примере буква Y заглавная?

Oк, спасибо, не обратил внимания.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Как увеличить дату?

Сообщение drBatty »

Cetary писал(а):
24.05.2010 14:53
Напишите пожалуйста готовый пример, где к дате с одной переменной прибавляется 15 дней, а потом результат сохраняется в другой переменной, а то хоть убей не получается.

вот уже написали:
t.t писал(а):
21.05.2010 11:38
"date -d @$(( $(date +%s)+21*24*60*60 ))"

только ту 21 день, и не в переменную. но это мелочи...

http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: Как увеличить дату?

Сообщение /dev/random »

Позволю себе немножко пофлеймить. Любители преобразовывать время в секунды, прибавьте-ка своим способом к дате 3 года. Чтобы месяц и число остались прежними. С учётом високосных лет. Или лучше так: прибавьте 3 месяца. Чтобы из 5 января получилось 5 апреля, а из 8 мая - 8 августа. С учётом разного количества дней в месяцах.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Как увеличить дату?

Сообщение NickLion »

Добавлю насчёт секунд:
1. Секунда координации
2. Перевод летнего/зимнего времени
Особенно второй пункт проблемный.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Как увеличить дату?

Сообщение drBatty »

/dev/random писал(а):
26.05.2010 06:43
Позволю себе немножко пофлеймить. Любители преобразовывать время в секунды, прибавьте-ка своим способом к дате 3 года. Чтобы месяц и число остались прежними

это уже другая задача. а вообще тут разные результаты получаются, и на практике сложно сказать, чей способ правильный. конечно, для вычисления возраста ваш способ обычно верный, но не всегда... а в секунды переводить плохо ещё и из-за проблемы 2037го года :(
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Как увеличить дату?

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

/dev/random писал(а):
26.05.2010 06:43
Позволю себе немножко пофлеймить. Любители преобразовывать время в секунды, прибавьте-ка своим способом к дате 3 года. Чтобы месяц и число остались прежними. С учётом високосных лет. Или лучше так: прибавьте 3 месяца. Чтобы из 5 января получилось 5 апреля, а из 8 мая - 8 августа. С учётом разного количества дней в месяцах.
Добавлю: при учёте високосных лет не забыть об особенностях григорианского календаря в отношении лет, кратных ста и тысяче. Это уж чтобы наверняка жизнь малиной не казалась. (:
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Как увеличить дату?

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

drBatty писал(а):
26.05.2010 07:57
/dev/random писал(а):
26.05.2010 06:43
Позволю себе немножко пофлеймить. Любители преобразовывать время в секунды, прибавьте-ка своим способом к дате 3 года. Чтобы месяц и число остались прежними
это уже другая задача.
Это -- другая. А вот упомянутый ниже переход на летнее время -- проблема, относящаяся именно к этой задаче.

drBatty писал(а):
26.05.2010 07:57
а вообще тут разные результаты получаются, и на практике сложно сказать, чей способ правильный. конечно, для вычисления возраста ваш способ обычно верный, но не всегда...
Почему сложно сказать? В тех случаях, когда эти два способа покажут разные результаты, правильным будет способ, предоставляемый командой date (days, weeks и т.д.).

drBatty писал(а):
26.05.2010 07:57
а в секунды переводить плохо ещё и из-за проблемы 2037го года :(
2038-го. Эта проблема не только перевода в секунды касается, она в принципе ещё не решена:

Shell

$ date -d +27years вт май 26 2037 08:29:27 EEST $ date -d +28years date: invalid date `+28years'
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Как увеличить дату?

Сообщение ZyX »

t.t писал(а):
26.05.2010 09:35
2038-го. Эта проблема не только перевода в секунды касается, она в принципе ещё не решена:

Shell

$ date -d +27years вт май 26 2037 08:29:27 EEST $ date -d +28years date: invalid date `+28years'

У меня работает и +28 лет, и +29, и даже +1 000 000 000 лет. А вот +10 000 000 000 уже не работает.

// Проверил на ноутбуке. Не работает, возможная причина: на ноутбуке 32-битный Celeron, на рабочем компьютере — 64-битный Phenom.
Спасибо сказали: