Unixから日付を減算する

Unixから日付を減算する

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

例:

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日* 86400秒を減算することです。それからの日数。

set -xたとえば、D変数の値が変更されていることを確認できるように、次の例を使用します。

#! /bin/ksh

set -x

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

date -d "@$D"

これはdateGNU CoreutilsのGNUバージョンによって異なります。他のバージョンの日付@gawk

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

私の最初の答えは通常のawkを使用することを提案しましたが、私のDebianシステムで追加のテストを実行した結果、この機能が利用できないか組み込まれていないため、mawkGNU 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日付を使用していることを確認できます。

答え4

この試み。

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

print $DAY30

720は時間単位のオフセットです。したがって、30日は720時間です。

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

関連情報