Wie kann ich das Datum drucken, das einen Tag vor der aktuellen Uhrzeit in Bash liegt?
--date
oder -d
ist nur im GNU-Datum verfügbar
Wie kann ich das Datum drucken, das einen Tag vor der aktuellen Uhrzeit in Bash liegt?
--date
oder -d
ist nur im GNU-Datum verfügbar
Antworten:
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
date -v-1d
unter OSX (minus), -v+1d
(plus)
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 }
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
date --date='-1 day'
date: illegal option -- -
date
über das coreutils
Paket verfügbare GNU-Version von installieren , damit diese Syntax unter macOS funktioniert. Wenn Sie Homebrew verwenden, können Sie es über installieren. brew install coreutils
Danach sollten Sie in der Lage sein, das GNU-Datum über den gdate
Befehl zu verwenden. Siehe: topbug.net/blog/2013/04/14/…
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
Erweitertes Bash-Scripting-Handbuch
date +%Y:%m:%d -d "yesterday"
Einzelheiten zum Datumsformat finden Sie in der Manpage zum Datum
date --date='-1 day'
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
bash $(TZ=America/New_York date +%Y-%m-%d)
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
date --date='-1 day'
#!/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 July , 2013
das Ergebnis, das ausgedruckt wird 2013-6-1347
, während das erwartete Ergebnis2013-6-30
echo $(cal $month $year)|tr ' ' '\n'|tail -n 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 ;-)
date -d "yesterday" '+%Y-%m-%d'
oder
date=$(date -d "yesterday" '+%Y-%m-%d')
echo $date
date: illegal option: -d
zu Solaris. Ihre Antwort , die auf nicht-portable GNU Erweiterungen setzt das POSIX-Standard - date
Dienstprogramm für eine Frage über die Nicht-GNU Solaris - Plattform.
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
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
date +%Y:%m:%d|awk -vFS=":" -vOFS=":" '{$3=$3-1;print}'
2009:11:9