Subtrahieren von Daten unter Unix

Subtrahieren von Daten unter Unix

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 gawkwahrscheinlich 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 mawknoch original-awkdie strftimeFunktion 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.

verwandte Informationen