Ottieni la data (un giorno prima dell'ora corrente) in Bash


171

Come posso stampare la data che è un giorno prima dell'ora corrente in Bash?


Ho provato la data ma sembra che non ci sia -d switch nella bash di Solaris 10
conandor

Ho trovato un'altra ottima soluzione installando gnu date (pacchetto coreutil) da sunfreeware.
Conandor,

né v'è un'opzione -d a Aix data
Frankster

L' opzione --dateo -dè disponibile solo in data GNU
Chris FA Johnson,

Vedere stackoverflow.com/q/15374752/462865 per una versione DST sicura di questa domanda.
Amir Ali Akbari,

Risposte:


262

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

1
Ho trovato che la maggior parte sono come risposta suggerita ma -d switch non si trova nella data di Solaris
conandor

3
Per l'utilizzo su Ubuntu con la funzione data: $ (data +% Y:% m:% d -d "1 giorno fa"), l'output è: 2013: 04: 21. E se vuoi la data 10 giorni prima, puoi usare $ (data +% Y:% m:% d -d "10 giorni fa") o $ (data +% Y:% m:% d -d "10 giorno fa ")
zhihong,

Su OS X è possibile installare coreutils attraverso birra: vedi stackoverflow.com/questions/15374752/...
kasterma

11
date -v-1dsu OSX (meno), -v+1d(più)
bgs,

2
Questa funzione bash funzionerà sia su Linux che su OSX. Fondamentalmente prova prima lo stile GNU Linux. Se fallisce, prova lo stile OSX. Chiamalo con una discussione sul numero di giorni passati in cui vuoi la data. Se non si passa alcun argomento, si presume 0 giorni. Questo codice è a riga singola, quindi taglia e incolla dovrebbe funzionare - non si presuppone la fine di una riga. 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

Se hai BSD (OSX) datepuoi 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

41
date --date='-1 day'

4
Erros su macOS Sierra:date: illegal option -- -
kuanb,

2
Devi installare la versione GNU di date, disponibile attraverso il coreutilspacchetto, 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 gdatecomando. Vedi: topbug.net/blog/2013/04/14/…
sumitsu


7

Bene, questa è una risposta tardiva, ma sembra funzionare !!

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


4

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

Questo metodo non è affidabile al 100% (circa il 98% in realtà) se ti capita di vivere in un luogo usando l'ora legale.
jlliagre,

Non esattamente, puoi usare bash $(TZ=America/New_York date +%Y-%m-%d)
phray2002 il

3

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


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

Imposta la data di ieri nel formato AAAA-MM-GG in variabile $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 per la correzione, metodo interessante, anche se è un po 'prolisso.
Peter Lindqvist,

1
Ciao medoix, non riesco a trovare il significato di $ {$ #}. So che $ # sta per il numero di argomenti di uno script / funzione. Ma non sono in grado di collegarmi a questo. Per favore aiuto.
Karthick S,

Questo non funziona per il giorno precedente su cambio di mese. Ad esempio oggi lo è 1 July , 2013, il risultato in fase di stampa è 2013-6-1347, mentre il risultato atteso è2013-6-30
errato

Invece delle 3 righe tra "fi" try "day = echo $(cal $month $year)|tr ' ' '\n'|tail -n 1"
Anton Roslov,

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 ;-)



0

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


0

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

0

Non molto sexy ma potrebbe fare il lavoro:

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)'

Formata dalla risposta "Martin Clayton".


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.