날짜에 X일을 추가하고 새 날짜를 얻는 방법은 무엇입니까?

날짜에 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 또는 조작 날짜 명령을 사용합니까?)

답변1

-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

형식 문자열로 "+x일"을 사용할 수 있습니다.

$ date -d "+10 days"

답변3

Mac OS(및 기타 BSD 배포판):

$ date -v -1d

date 명령을 사용하여 1일 전환 확인 날짜를 얻으려면:

$ 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

답변4

이전 답변과 마찬가지로 -d다음과 같은 스위치를 사용할 수 있습니다.

date -d "$myDate + 10 days"

하지만 시간대에 주의를 기울여야 합니다!

문제가 발생할 수 있는 예: 시간대가 몬트리올이고 일광 절약 시간이 오전 2시부터 시작되는 "2020년 3월 8일"에 대해 "하루의 시작, 끝"과 같이 하루의 시간 간격을 가져오려는 경우 , 넌 할 수있어

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"

2020년 3월 9일에 1시간의 시간이 주어집니다.

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")

관련 정보