Unix で日付を減算する

Unix で日付を減算する

Unix で特定の日付から 1 か月または少なくとも 30 日を減算する方法はありますか? 日付はユーザーが入力します。

例:

2012-11-19 - 1 か月 = 2013-10-19

これは機能しません:

date -d '2013-10-13 - 1 month' '+%F'

答え1

最も簡単な方法は、日付を UNIX の time_t 値 (つまり、エポックの開始からの秒数、つまり「1-1-1970 00:00:00」) に変換し、その数値から 30 日 * 1 日あたり 86400 秒を減算することです。

たとえば、次の例では、set -xD 変数の値が変化する様子を確認できるように を使用します。

#! /bin/ksh

set -x

D=$(date -d '2013-10-13' '+%s')
D=$((D - 30 * 86400))

date -d "@$D"

これは、GNU Coreutils の GNU バージョンに依存することに注意してくださいdate。 date の他のバージョンでは、 time_t 値を でフォーマットされた日付に戻す変換がサポートされていない可能性があります@。 GNU coreutils をインストールしていない限り、これはおそらく AIX システムで利用できないため、gawkフォーマットされた日付に戻すには、これがおそらく最善のオプションです。

echo "$D" | gawk '{print strftime("%c", $0)}'

ここでの私の最初の回答では、単純な awk を提案しましたが、Debian システムでさらにテストしたところ、どちらにも関数が組み込まれていmawkないことが判明したため、GNU Coreutils または GNU Awk のいずれかをインストールする必要があります。original-awkstrftime

システムに perl がインストールされている場合は、awk の代わりに perl を使用できます。

echo $D | perl -nE 'say scalar gmtime $_'

これを行うための代替方法と例は、以下でいくつかあります。

https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line

答え2

これを試して:

date --date="$(date -d "Nov 1 2012")-1 month" +'%Y:%m:%d'
2012:10:01

2012 年 11 月 1 日が説明に使用されています。これは、ユーザーが入力した任意の日付になります。

答え3

この例では、GNU 日付拡張機能である日付文字列内の相対項目が使用されています。

たとえば、Fedora 19 では、次の例は期待どおりに動作します。

$ date -d '2013-10-13 - 1 month' '+%F'
2013-09-13

したがって、スクリプトが GNU date を使用していることを確認できます。

答え4

これを試して。

DAY30=`TZ=EST+720 date "+%Y-%m-%d"`

print $DAY30

720 は時間単位のオフセットです。つまり、30 日は 720 時間です。

私のタイムゾーンは EST です。適切なタイムゾーンであればどれでも使用できると思います。

関連情報