UNIXで特定の日付から1か月または少なくとも30日を引く方法はありますか?日付はユーザーが入力します。
例:
2012-11-19-1か月= 2013-10-19
これは機能しません:
date -d '2013-10-13 - 1 month' '+%F'
最も簡単な方法は、日付をUNIXのtime_t値(つまり、エポックの開始からの秒数、または「1-1-1970 00:00:00」)に変換し、それから30日* 1日あたり86400秒を引くことです。数。
例えば次の例では、set -x
を使用して、D変数の値が変化するのを確認できるようにしています。
#! /bin/ksh
set -x
D=$(date -d '2013-10-13' '+%s')
D=$((D - 30 * 86400))
date -d "@$D"
これは、GNU date
のバージョン、GNU Coreutilsからのバージョンに依存します。他のバージョンの日付は、time_t値の変換をサポートしない場合があります。 @
でフォーマットされた日付に変換します。GNU coreutilsをインストールしていない限り、これはおそらくAIXシステムでは使用できないため、gawk
がおそらくフォーマットされた日付に変換し直す:
echo "$D" | gawk '{print strftime("%c", $0)}'
ここでの私の元の答えは明白なawkを示唆していましたが、debianシステムでのさらなるテストにより、mawk
とoriginal-awk
のどちらにもstrftime
関数が組み込まれていないことが明らかになりました。 GNU CoreutilsまたはGNU Awk。
システムにPerlがインストールされている場合、awkの代わりにPerlを使用できます。
echo $D | Perl -nE 'say scalar gmtime $_'
これを行ういくつかの代替方法と例があります:
https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line
これを試して:
date --date="$(date -d "Nov 1 2012")-1 month" +'%Y:%m:%d'
2012:10:01
2012年11月1日は説明のために使用されています。これは、任意のユーザー入力日付にすることができます。
これを試して。
DAY30=`TZ=EST+720 date "+%Y-%m-%d"`
print $DAY30
720は時間単位のオフセットです。つまり、30日は720時間です。
ESTは私のタイムゾーンです。適切なタイムゾーンを使用できると思います。
あなたの例では、GNU日付拡張子である日付文字列で相対項目を使用しています。
たとえばFedora 19では、例は期待どおりに動作します。
$ date -d '2013-10-13 - 1 month' '+%F'
2013-09-13
したがって、スクリプトでGNU dateを使用していることを確認できます。