Data del formato AAAA-MM-GG nello script della shell


1112

Ho provato a usare $(date)nel mio script shell bash, tuttavia, voglio la data inYYYY-MM-DD formato.
Come ottengo questo?

Risposte:


1832

In bash (> = 4.2) è preferibile usare il formatter data incorporato di printf (parte di bash) piuttosto che l'esterno date(di solito data GNU).

Come tale:

# put current date as yyyy-mm-dd in $date
# -1 -> explicit current date, bash >=4.3 defaults to current time if not provided
# -2 -> start time for shell
printf -v date '%(%Y-%m-%d)T\n' -1 

# put current date as yyyy-mm-dd HH:MM:SS in $date
printf -v date '%(%Y-%m-%d %H:%M:%S)T\n' -1 

# to print directly remove -v flag, as such:
printf '%(%Y-%m-%d)T\n' -1
# -> current date printed to terminal

In bash (<4.2):

# put current date as yyyy-mm-dd in $date
date=$(date '+%Y-%m-%d')

# put current date as yyyy-mm-dd HH:MM:SS in $date
date=$(date '+%Y-%m-%d %H:%M:%S')

# print current date directly
echo $(date '+%Y-%m-%d')

Altri formati di data disponibili possono essere visualizzati dalle pagine man della data (per comando esterno non bash specifico):

man date

4
Nei primi giorni del mese ricevo "2012-07-1" che non è quello che l'OP chiede.
DerMike,

6
Questo funziona per me. La pagina man suggerisce che il primo del mese è 01, n. 1 (Ex. 2012-07-01).
Bob Kuhar,

31
DATA = $ (data +% d-% m-% Y ""% H:% M:% S); Quello che ho finito dopo.
JacopKane,

5
Non ho verificato la disponibilità di queste scorciatoie, ma in alcune distribuzioni puoi usare +%F %Tcome scorciatoia +%Y-%m-%d %H:%M:%S. Basta notare che alcuni filesystem (tosse ** HFS) convertiranno il file :in a /, dandoti una stringa come la 2016-09-15 11/05/00quale è molto confusa.
Beporter,

24
La sintassi preferita in qualsiasi shell conforme a POSIX in questo millennio è date=$(date)invece di date=`date`. Inoltre, non utilizzare le maiuscole per le variabili private; i nomi delle variabili maiuscole sono riservati per il sistema.
Tripleee,

335

Provare: $(date +%F)


12
Le pagine man per data indicano:% F data completa; uguale a% Y-% m-% d, quindi questa è solo una notazione più compatta per la risposta accettata.
Håvard Geithus,


47

Stai cercando il formato di data standard ISO 8601 , quindi se hai una data GNU (o qualsiasi comando di data più moderno del 1988) fai semplicemente:$(date -I)


9
Ho un recente (> 1988) computer Mac OS X e date -Inon ha funzionato. Dopo aver installato i coreutils GNU usando brew (che usa il prefisso 'g') gdate -Iha funzionato.
Joel Purra,

3
Dispari. Non riesco a trovare l' -Iopzione documentata per GNU date, anche se abbastanza sicuro sembra essere equivalente a date +%F.
Chepner,

3
OS X è generalmente una terra desolata di GPL v3, quindi potrebbero non avere la data di aggiornamento o BASH di recente.
Indolente il

20
date -d '1 hour ago' '+%Y-%m-%d'

L'output sarebbe 2015-06-14.


3
Sbagliato per un paio di motivi, ovviamente questo dà una data sbagliata tra le 00:00 e l'01: 00, e inoltre si finisce con un %.
Gerhard Burger,

non è vero. dovrebbe essere come questa singola citazione sparsa
Beyhan Gül,

20
$(date +%F_%H-%M-%S)

può essere usato per rimuovere due punti (:) tra

produzione

2018-06-20_09-55-58

19

Con Bash recente (versione ≥ 4.2), è possibile utilizzare il built-in printfcon il modificatore di formato %(strftime_format)T:

$ printf '%(%Y-%m-%d)T\n' -1  # Get YYYY-MM-DD (-1 stands for "current time")
2017-11-10
$ printf '%(%F)T\n' -1  # Synonym of the above
2017-11-10
$ printf -v date '%(%F)T' -1  # Capture as var $date

printfè molto più veloce rispetto a datequando è incorporato in Bash mentre dateè un comando esterno.

Inoltre, printf -v date ...è più veloce rispetto a date=$(printf ...)quando non richiede il fork di una subshell.


4
Come nota nel 2019, questo comando è incredibilmente più veloce * rispetto a datese lo stai già utilizzando all'interno di uno script bash, poiché non deve caricare librerie extra. (* Ho misurato sul mio server Linux una differenza di velocità di ~ 160x su 1000 iterazioni)
timtj

@timtj Grazie per averlo sottolineato! Ho aggiunto alcune note sulla velocità alla risposta.
wjandrea,

1
Vorrei poter fare +5 per il commento di printf -v datenon fare il fork di una subshell. Informazioni molto buone !!
timtj

Di solito uso la data perché devo anche aumentare alcune date. Può stampare l'aritmetica della data?
Merlin,

1
@Merlin Non credo
wjandrea

8

Ogni volta che ho un compito come questo finisco per ricadere

$ man strftime

per ricordare a me stesso tutte le possibilità.


7

se desideri l'anno in un formato a due numeri come 17 anziché 2017, procedi come segue:

DATE=`date +%d-%m-%y`

6
#!/bin/bash -e

x='2018-01-18 10:00:00'
a=$(date -d "$x")
b=$(date -d "$a 10 min" "+%Y-%m-%d %H:%M:%S")
c=$(date -d "$b 10 min" "+%Y-%m-%d %H:%M:%S")
#date -d "$a 30 min" "+%Y-%m-%d %H:%M:%S"

echo Entered Date is $x
echo Second Date is $b
echo Third Date is $c

Qui x è la data di esempio utilizzata e quindi l'esempio mostra sia la formattazione dei dati che la ricezione delle date 10 minuti in più rispetto alla data corrente.


6

Uso la seguente formulazione:

TODAY=`date -I`
echo $TODAY

Dai un'occhiata alla pagina man per date, ci sono una serie di altre opzioni utili:

man date

5

Uso $(date +"%Y-%m-%d") o $(date +"%Y-%m-%d %T")con tempo e ore.


1

Puoi impostare la data come variabile d'ambiente e successivamente puoi usarla

setenv DATE `date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"

o

DATE =`date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"
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.