Come posso stampare la data che è un giorno prima dell'ora corrente in Bash?
--date
o -d
è disponibile solo in data GNU
Come posso stampare la data che è un giorno prima dell'ora corrente in Bash?
--date
o -d
è disponibile solo in data GNU
Risposte:
se hai una data GNU e ti ho capito bene
$ date +%Y:%m:%d -d "yesterday"
2009:11:09
o
$ date +%Y:%m:%d -d "1 day ago"
2009:11:09
date -v-1d
su OSX (meno), -v+1d
(più)
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 }
Se hai BSD (OSX) date
puoi farlo in questo modo:
date -j -v-1d
Wed Dec 14 15:34:14 CET 2011
O se vuoi fare calcoli sulla data in una data arbitraria:
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
, disponibile attraverso il coreutils
pacchetto, per far funzionare questa sintassi su macOS. Se stai usando Homebrew, puoi installarlo tramite brew install coreutils
, dopo di che dovresti essere in grado di usare la data GNU tramite il gdate
comando. Vedi: topbug.net/blog/2013/04/14/…
MAC OSX
Per la data di ieri:
date -v-1d +%F
dove 1d definisce il giorno corrente meno 1 giorno. Allo stesso modo,
data -v-1w +% F - per la data della settimana precedente
data -v-1m +% F - per la data del mese precedente
SE AVETE DATA GNU,
date --date="1 day ago"
Maggiori informazioni: https://www.cyberciti.biz/tips/linux-unix-get-yesterdays-tomorrows-date.html
Guida avanzata agli script di Bash
date +%Y:%m:%d -d "yesterday"
Per dettagli sul formato della data, consultare la pagina man per data
date --date='-1 day'
Mi spiace non menzionare I sul sistema Solaris. Pertanto, l'opzione -date non è disponibile su Solaris bash.
Scopro che posso ottenere la data precedente con un piccolo trucco sul fuso orario.
DATE=`TZ=MYT+16 date +%Y-%m-%d_%r`
echo $DATE
bash $(TZ=America/New_York date +%Y-%m-%d)
Usa Perl invece forse?
perl -e 'print scalar localtime( time - 86400 ) . "\n";'
Oppure usa nawk e (ab) usa / usr / bin / adb:
nawk 'BEGIN{printf "0t%d=Y\n", srand()-86400}' | adb
Ci siamo imbattuti anche in questo ... folle!
/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
, il risultato in fase di stampa è 2013-6-1347
, mentre il risultato atteso è2013-6-30
echo $(cal $month $year)|tr ' ' '\n'|tail -n 1
"
Potresti fare un semplice calcolo, stimolato con una regex, se il formato della data scelto è 'AAAAMM':
echo $(($(date +"%Y%m") - 1)) | sed -e 's/99$/12/'
Nel gennaio del 2020 tornerà 201912 ;-) Ma è solo una soluzione alternativa, quando la data non ha opzioni di calcolo e altre opzioni dell'interprete (ad es. Usando perl) non disponibili ;-)
date -d "yesterday" '+%Y-%m-%d'
o
date=$(date -d "yesterday" '+%Y-%m-%d')
echo $date
date: illegal option: -d
Solaris. La tua risposta che si basa su estensioni GNU non portatili all'utilità standard POSIXdate
per una domanda sulla piattaforma Solaris non GNU.
Prova il codice seguente, che si occupa anche della parte DST.
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
Soluzione consapevole dell'ora legale:
La manipolazione del fuso orario è possibile per cambiare l'orologio alcune ore. A causa dell'ora legale, 24 ore fa possono essere oggi o l'altro ieri.
Sei sicuro che ieri sono state 20 o 30 ore fa. Quale? Bene, il più recente che non è oggi.
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
Il parametro -e usato nel comando echo è necessario con bash, ma non funzionerà con ksh. In ksh puoi usare lo stesso comando senza il flag -e.
Quando lo script verrà utilizzato in diversi ambienti, è possibile avviare lo script con #! / Bin / ksh o #! / Bin / bash. Puoi anche sostituire \ n con una nuova riga:
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