linux + додати X днів до дати та отримати нову віртуальну дату


115

У мене є машина Linux (RH 5.3)

Мені потрібно додати / обчислити 10 днів плюс дату, тож я отримаю нову дату (термін придатності))

наприклад

 # date 
 Sun Sep 11 07:59:16 IST 2012

Тому мені потрібно дістати

     NEW_expration_DATE = Sun Sep 21 07:59:16 IST 2012

Будь ласка, порада, як обчислити нову дату закінчення терміну дії (за допомогою команди bash, ksh або маніпулювати датою?)

Відповіді:


158

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

date
Sun Sep 23 08:19:56 BST 2012
NEW_expration_DATE=$(date -d "+10 days")
echo $NEW_expration_DATE
Wed Oct 3 08:12:33 BST 2012 
  -d, --date=STRING
          display time described by STRING, not now

Це досить потужний інструмент, оскільки ви можете робити такі речі

date -d "Sun Sep 11 07:59:16 IST 2012+10 days"
Fri Sep 21 03:29:16 BST 2012

або

TZ=IST date -d "Sun Sep 11 07:59:16 IST 2012+10 days"
Fri Sep 21 07:59:16 IST 2012

або

prog_end_date=`date '+%C%y%m%d' -d "$end_date+10 days"`

Отже, якщо $ end_date = 20131001, то $ prog_end_date = 20131011


2
Дякую!! Ваші приклади мають бути на dateінформаційній сторінці GNU !
Давор Кубраніч

Ніколи не знав, що я можу це зробити - це справді приємне рішення.
Тім

1
+1: Дивовижний. Корисна відповідь.
мідь.хать

1
У ОС X при використанні вбудованої дати ви отримаєте помилку. Використовуйте brew install coreutilsдля установки функції дати GNU, в gdate.
CousinCocaine

2
не працює: $ docker run -it bash bash bash-5.0# date -d "+10 days" date: invalid date '+10 days' bash-5.0#
Крістіан Бонгіорно,

37

Ви можете використовувати "+ x днів" як рядок формату:

$ date -d "+10 days"

20
$ date -v -1d

Для отримання дати повернення на 1 день за допомогою команди date:

$ date -v -1d

Він дасть (поточна дата -1) означає за 1 день до цього.

$ date -v +1d

Це дасть (поточна дата +1) означає через 1 день після.

Аналогічно нижче написаний код можна використовувати замість "d", щоб дізнатися рік, місяць тощо.

y-Year
m-Month 
w-Week 
d-Day 
H-Hour 
M-Minute  
S-Second

8
Це працює для мене на моєму mac, але не на наших серверах Gentoo.
Майк Доттерер

Набагато краще, ніж прийнята відповідь, це дозволяє дозволити формати дати також в одному рядку.
pferrel

9
це не працює на Ubuntu 15.10 або RedHat 6.6. Я припускаю, що він також не працює на RH5.3. Причина: '-v' та '-1d' не є дійсними перемикачами на 'date'
syss

2
Схоже, це синтаксис Unix / BSD date, який GNU date( gdateу багатьох BSD) не підтримує. GNU dateвикористовує синтаксис у прийнятій відповіді. Завжди пам’ятайте: GNU - це не Unix!
бекон

1
@BaconBits - але якщо ви є rms, ви можете це стверджувати, оскільки багато Linux утилітного коду GNU перенесено до Linux, тому "Linux - це GNU". За винятком, звичайно, того, що GNU Hurd (FSF's Once-And-Future-OS) - це ледь не річ. Я гадаю, що збиває з себе те, що, витрачаючи час на понтифікацію, Лінус витрачав свій час на написання коду - що, як виявляється, підтверджує, що ти можеш створити робоче програмне забезпечення, якщо ти пишеш код, ніж якщо ти понтифікуєшся. :-)
Боб Джарвіс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.