it-swarm-ru.tech

Как добавить X дней к дате и получить новую дату?

У меня есть 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 или манипулировать датой?)

124
yael

Вы можете просто использовать -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

171
user591

Вы можете использовать "+ x days" в качестве строки формата:

$ date -d "+10 days"
41
quanta
$ 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
21
Abhilash Kumar

Как и в предыдущих ответах, вы можете использовать -d переключаться как:

date -d "$myDate + 10 days"

Но вы должны быть осторожны с часовым поясом!

Пример чего-то, что может пойти не так: если вы хотите получить интервал для дня, такого как [начало дня, конец дня] для "8 марта 2020 года" с часовым поясом в Монреале, где летнее время начинается в 2:00 00:00, вы могли бы сделать

startDate=$(date --iso-8601=n -d "8 march 2020 00:00:00.000000001")
endDate=$(date --iso-8601=n -d "$startDate + 1 day")

но вместо

startDate → "2020-03-08T00:00:00,000000001-0500"
endDate   → "2020-03-09T00:00:00,000000001-0400"

вы получите 1 час 9 марта 2020 года

startDate → "2020-03-08T00:00:00,000000001-0500"
endDate   → "2020-03-09T01:00:00,000000001-0400"

Чтобы это исправить, вы можете сделать следующее:

# Returns the difference between two dates' local time offsets. E.g. : "3600" or "- 1800"
getLocalTimeOffsetDiffInSeconds() {

    # Get the offset in the following format: -0530 for -05h30min
    localOffset1=$(date -d "$1" +%z)
    localOffset2=$(date -d "$2" +%z)

    # Get the offset in seconds
    localOffsetInSec1=$(echo $localOffset1 | sed -E 's/^([+-])(..)(..)/scale=2;0\1(\2 * 3600 + \3 * 60)/' | bc)
    localOffsetInSec2=$(echo $localOffset2 | sed -E 's/^([+-])(..)(..)/scale=2;0\1(\2 * 3600 + \3 * 60)/' | bc)

    # Compute diff
    diffOffsetInSec=$(echo "$localOffsetInSec2 - $localOffsetInSec1" | bc)

    # Add a space between the sign and the value, so it can be used by the command "date".
    echo "$diffOffsetInSec" | sed -E 's/([+-])(.*)/\1 \2/'
}

  startDate=$(date --iso-8601=n -d "8 march 2020 00:00:00.000000001")
  endDate=$(date --iso-8601=n -d "$startDate + 1 day")

  # Fixes endDate if the DST changed between the two dates.

  dstDiff=$(getLocalTimeOffsetDiffInSeconds "$startDate" "$endDate")

  # dateFix will be a string to remove the dstDiff from the date in a format
  # that can be understood by the command "date". E.g. "3600 seconds" or "- 3600 seconds".
  dateFix=$(echo "$(echo "- $dstDiff" | bc | sed -E 's/([+-])(.*)/\1 \2/')")
  endDate=$(date --iso-8601=n -d "$endDate $dateFix seconds")
0
Adrian B.