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?

conandor
quelle
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
Ghostdog74
quelle
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
Jacob Persson
quelle
41
date --date='-1 day'
Leise
quelle
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
17

MAC OS X

Für das gestrige Datum:

date -v-1d +%F

Dabei definiert 1d den aktuellen Tag minus 1 Tag. Ähnlich,

Datum -v-1w +% F - für das Datum der vorherigen Woche

Datum -v-1m +% F - für das Datum des Vormonats

WENN SIE GNU DATUM HABEN,

date --date="1 day ago"

Weitere Informationen: https://www.cyberciti.biz/tips/linux-unix-get-yesterdays-tomorrows-date.html

Einzelgänger
quelle
7

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

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

Erweitertes Bash-Scripting-Handbuch

date +%Y:%m:%d -d "yesterday"

Einzelheiten zum Datumsformat finden Sie in der Manpage zum Datum

date --date='-1 day'
Peter Lindqvist
quelle
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
conandor
quelle
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
Martin Clayton
quelle
2

date --date='-1 day'

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

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

Heinzi
quelle
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
medoix
quelle
+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 ;-)

Sven
quelle
1
date -d "yesterday" '+%Y-%m-%d'

oder

date=$(date -d "yesterday" '+%Y-%m-%d')
echo $date
suresh Palemoni
quelle
Das führt date: illegal option: -dzu Solaris. Ihre Antwort , die auf nicht-portable GNU Erweiterungen setzt das POSIX-Standard - dateDienstprogramm für eine Frage über die Nicht-GNU Solaris - Plattform.
Andrew Henle
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

fehlgeleitet
quelle
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
Walter A.
quelle
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.

trox
quelle
-2
date +%Y:%m:%d|awk -vFS=":" -vOFS=":" '{$3=$3-1;print}'
2009:11:9
Vijay
quelle
Was ist, wenn heute der 1. Januar ist?
Martin Clayton