日付に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日」に対して、「1日の始まり、終わり」など、1日の時間間隔を取得したい場合、できます

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

関連情報