Gibt es unter Unix eine Möglichkeit, von einem bestimmten Datum einen Monat oder mindestens 30 Tage abzuziehen? Das Datum muss vom Benutzer eingegeben werden.
Beispiel:
19.11.2012 - 1 Monat = 19.10.2013
Das hier funktioniert nicht:
date -d '2013-10-13 - 1 month' '+%F'
Antwort1
Am einfachsten geht das, indem Sie das Datum in einen Unix-time_t-Wert (also Sekunden seit Beginn der Epoche oder „1.1.1970 00:00:00“) umwandeln und dann von dieser Zahl 30 Tage * 86400 Sekunden pro Tag abziehen.
Beispielsweise wird im folgenden Beispiel verwendet set -x
, sodass Sie den Wert der Variable D während seiner Änderung sehen können.
#! /bin/ksh
set -x
D=$(date -d '2013-10-13' '+%s')
D=$((D - 30 * 86400))
date -d "@$D"
Beachten Sie, dass dies von der GNU-Version von abhängt date
, die aus den GNU Coreutils stammt. Andere Versionen von date unterstützen möglicherweise nicht die Rückkonvertierung eines time_t-Werts in ein formatiertes Datum mit @
. Sofern Sie nicht die GNU Coreutils installiert haben, ist dies auf Ihrem AIX-System wahrscheinlich nicht verfügbar und daher gawk
wahrscheinlich die beste Option zur Rückkonvertierung in ein formatiertes Datum:
echo "$D" | gawk '{print strftime("%c", $0)}'
in meiner ursprünglichen Antwort hier habe ich einfaches Awk vorgeschlagen, aber weitere Tests auf meinem Debian-System haben ergeben, dass weder mawk
noch original-awk
die strftime
Funktion integriert ist. Sie müssen daher entweder GNU Coreutils oder GNU Awk installieren.
Wenn Perl auf dem System installiert ist, kann Perl anstelle von awk verwendet werden:
echo $D | perl -nE 'say scalar gmtime $_'
Hier finden Sie mehrere alternative Methoden und Beispiele hierzu:
https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line
Antwort2
Versuche dies:
date --date="$(date -d "Nov 1 2012")-1 month" +'%Y:%m:%d'
2012:10:01
Zur Veranschaulichung wird der 1. November 2012 verwendet. Dies kann jedes vom Benutzer eingegebene Datum sein.
Antwort3
Ihr Beispiel verwendet relative Elemente in Datumszeichenfolgen, die eine GNU-Datumserweiterung sind.
Unter Fedora 19 funktioniert Ihr Beispiel beispielsweise wie erwartet:
$ date -d '2013-10-13 - 1 month' '+%F'
2013-09-13
So können Sie sicherstellen, dass Ihr Skript GNU Date verwendet.
Antwort4
Versuche dies.
DAY30=`TZ=EST+720 date "+%Y-%m-%d"`
print $DAY30
720 ist der Versatz in Stunden. 30 Tage sind also 720 Stunden.
Meine Zeitzone ist EST. Ich gehe davon aus, dass Sie die Zeitzone verwenden können, die Ihnen am besten passt.