Holen Sie sich das Datum (einen Tag vor der aktuellen Zeit) in Bash


171

Wie kann ich das Datum drucken, das einen Tag vor der aktuellen Uhrzeit in Bash liegt?


Versuchtes Datum, aber es scheint, als gäbe es keinen -d-Schalter in Solaris
10s

Ich habe eine weitere großartige Lösung gefunden, indem ich gnu date (Coreutil-Paket) von Sunfreeware installiert habe.
Conandor

Es gibt auch keinen -d-Schalter in
AIXs

Die Option --dateoder -dist nur im GNU-Datum verfügbar
Chris FA Johnson

Eine DST-sichere Version dieser Frage finden Sie unter stackoverflow.com/q/15374752/462865 .
Amir Ali Akbari

Antworten:


262

Wenn du ein GNU-Datum hast und ich dich richtig verstanden habe

$ date +%Y:%m:%d -d "yesterday"
2009:11:09

oder

$ date +%Y:%m:%d -d "1 day ago"
2009:11:09

1
Ich fand, dass die meisten als vorgeschlagene Antwort sind, aber -d Schalter ist nicht in Solaris 'Datum gefunden
conandor

3
Für die Verwendung unter Ubuntu mit Datumsfunktion: $ (Datum +% Y:% m:% d -d "vor 1 Tag") lautet die Ausgabe: 2013: 04: 21. Und wenn Sie das Datum 10 Tage vorher möchten, können Sie $ (Datum +% Y:% m:% d - d "vor 10 Tagen") oder $ (Datum +% Y:% m:% d - d "10 verwenden vor einem Tag ")
zhihong

Unter OS X können Sie Coreutils über Brew
kasterma

11
date -v-1dunter OSX (minus), -v+1d(plus)
bgs

2
Diese Bash-Funktion funktioniert sowohl unter Linux als auch unter OSX. Grundsätzlich wird zuerst der GNU Linux-Stil ausprobiert. Wenn dies fehlschlägt, versucht es den OSX-Stil. Nennen Sie es mit einem Argument für die Anzahl der Tage in der Vergangenheit, an denen Sie das Datum haben möchten. Wenn Sie kein Argument übergeben, wird von 0 Tagen ausgegangen. Dieser Code ist ein Einzeiler, daher sollte Ausschneiden und Einfügen funktionieren - es werden keine Zeilenenden angenommen. date_days_past () { days_past=${1:-0}; if ! date -v-${days_past}d +%Y%m%d 2>/dev/null; then date --date="-${days_past} day" +%Y%m%d; fi }
Noah Spurrier

50

Wenn Sie BSD (OSX) haben date, können Sie dies folgendermaßen tun:

date -j -v-1d
Wed Dec 14 15:34:14 CET 2011

Oder wenn Sie Datumsberechnungen an einem beliebigen Datum durchführen möchten:

date -j -v-1d -f "%Y-%m-%d" "2011-09-01" "+%Y-%m-%d"
2011-08-31

41
date --date='-1 day'

4
Erros auf macOS Sierra:date: illegal option -- -
Kuanb

2
Sie müssen die dateüber das coreutilsPaket verfügbare GNU-Version von installieren , damit diese Syntax unter macOS funktioniert. Wenn Sie Homebrew verwenden, können Sie es über installieren. brew install coreutilsDanach sollten Sie in der Lage sein, das GNU-Datum über den gdateBefehl zu verwenden. Siehe: topbug.net/blog/2013/04/14/…
sumitsu


7

Nun, das ist eine späte Antwort, aber das scheint zu funktionieren !!

     YESTERDAY=`TZ=GMT+24 date +%d-%m-%Y`;
     echo $YESTERDAY;


4

Es tut mir leid, dass ich das Solaris-System nicht erwähne. Daher ist der Schalter -date in Solaris bash nicht verfügbar.

Ich finde heraus, dass ich das vorherige Datum mit einem kleinen Trick in der Zeitzone erhalten kann.

DATE=`TZ=MYT+16 date +%Y-%m-%d_%r`
echo $DATE

Diese Methode ist nicht 100% zuverlässig (ungefähr 98% tatsächlich), wenn Sie an einem Ort mit Sommerzeit leben.
11.

Nicht genau, können Sie verwenden bash $(TZ=America/New_York date +%Y-%m-%d)
phray2002

3

Verwenden Sie stattdessen vielleicht Perl?

perl -e 'print scalar localtime( time - 86400 ) . "\n";'

Oder benutze nawk und (ab) benutze / usr / bin / adb:

nawk 'BEGIN{printf "0t%d=Y\n", srand()-86400}' | adb

Ich stieß auf diese zu ... verrückt!

/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= '/^time\(\)/ {gsub(/ /,"",$2);printf "0t%d=Y\n", $2-86400}' | adb


1
yesterday=`date -d "-1 day" %F`

Setzt das gestrige Datum im Format JJJJ-MM-TT in eine Variable $yesterday.


1
#!/bin/bash
OFFSET=1;
eval `date "+day=%d; month=%m; year=%Y"`
# Subtract offset from day, if it goes below one use 'cal'
# to determine the number of days in the previous month.
day=`expr $day - $OFFSET`
if [ $day -le 0 ] ;then
month=`expr $month - 1`
if [ $month -eq 0 ] ;then
year=`expr $year - 1`
month=12
fi
set `cal $month $year`
xday=${$#}
day=`expr $xday + $day`
fi
echo $year-$month-$day

+1 zur Korrektur, interessante Methode, obwohl sie etwas ausführlich ist.
Peter Lindqvist

1
Hallo medoix, ich kann die Bedeutung von $ {$ #} nicht finden. Ich weiß, dass $ # für die Anzahl der Argumente für ein Skript / eine Funktion steht. Aber ich kann mich nicht darauf beziehen. Bitte helfen Sie.
Karthick S

Dies funktioniert nicht für den vorherigen Tag bei Monatswechsel. Zum Beispiel ist heute 1 July , 2013das Ergebnis, das ausgedruckt wird 2013-6-1347, während das erwartete Ergebnis2013-6-30
fehlgeleitet am

Anstelle der 3 Zeilen zwischen dem "fi" versuchen Sie "day = echo $(cal $month $year)|tr ' ' '\n'|tail -n 1"
Anton Roslov

1

Sie können eine einfache Berechnung mit einem regulären Ausdruck durchführen, wenn das gewählte Datumsformat "JJJJMM" lautet:

echo $(($(date +"%Y%m") - 1)) | sed -e 's/99$/12/'

Im Januar 2020 wird 201912 zurückgegeben ;-) Es ist jedoch nur eine Problemumgehung, wenn für das Datum keine Berechnungsoptionen und andere Dateninterpreteroptionen (z. B. mit Perl) nicht verfügbar sind ;-)



0

Versuchen Sie den folgenden Code, der sich auch um den DST-Teil kümmert.

if [ $(date +%w) -eq $(date -u +%w) ]; then
  tz=$(( 10#$gmthour - 10#$localhour ))
else
  tz=$(( 24 - 10#$gmthour + 10#$localhour ))
fi
echo $tz
myTime=`TZ=GMT+$tz date +'%Y%m%d'`

Courtsey Ansgar Wiechers


0

DST-fähige Lösung:

Das Manipulieren der Zeitzone ist möglich, um die Uhr einige Stunden zu ändern. Aufgrund der Sommerzeit kann 24 Stunden heute oder vorgestern sein.

Sie sind sicher, dass gestern vor 20 oder 30 Stunden war. Welcher? Nun, die jüngste, die es heute nicht gibt.

echo -e "$(TZ=GMT+30 date +%Y-%m-%d)\n$(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1

Der im Befehl echo verwendete Parameter -e wird für bash benötigt, funktioniert jedoch nicht mit ksh. In ksh können Sie denselben Befehl ohne das Flag -e verwenden.

Wenn Ihr Skript in verschiedenen Umgebungen verwendet wird, können Sie das Skript mit #! / Bin / ksh oder #! / Bin / bash starten. Sie können das \ n auch durch eine neue Zeile ersetzen:

echo "$(TZ=GMT+30 date +%Y-%m-%d)
$(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1

0

Nicht sehr sexy, könnte aber den Job machen:

perl -e 'my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time - 86400);$year += 1900; $mon+= 1; printf ("YESTERDAY: %04d%02d%02d \n", $year, $mon, $mday)'

Aus "Martin Clayton" Antwort gebildet.


-2
date +%Y:%m:%d|awk -vFS=":" -vOFS=":" '{$3=$3-1;print}'
2009:11:9

Was ist, wenn heute der 1. Januar ist?
Martin Clayton
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.