web-dev-qa-db-ja.com

UNIXでの日付の減算

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

例:

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

これは機能しません:

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

最も簡単な方法は、日付を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システムでのさらなるテストにより、mawkoriginal-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

3
cas

これを試して:

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

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

2
smRaj

これを試して。

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

print $DAY30

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

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

0
Scorer61

あなたの例では、GNU日付拡張子である日付文字列で相対項目を使用しています。

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

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

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

0
maxschlepzig