Data do formato AAAA-MM-DD no script de shell

1112

Tentei usar $(date)no meu script shell bash, no entanto, quero a data em YYYY-MM-DDformato.
Como faço para conseguir isso?

Kapsh
fonte

Respostas:

1832

No bash (> = 4.2), é preferível usar o formatador de datas incorporado do printf (parte do bash) em vez do externo date(geralmente a data GNU).

Assim sendo:

# 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

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

Outros formatos de data disponíveis podem ser visualizados nas páginas de manual da data (para comando externo não específico do bash):

man date
Philip Fourie
fonte
4
Nos primeiros dias do mês, recebo "2012-07-1", que não é o que o OP solicita.
DerMike
6
Isso funciona para mim. A página do manual sugere que o primeiro do mês seja 01, nº 1 (Ex. 2012-07-01).
22813 Bob Kuhar
31
DATA = $ (data +% d-% m-% Y ""% H:% M:% S); O que eu acabei depois.
JacopKane
5
Não verifiquei quão amplamente disponíveis esses atalhos estão, mas em algumas distribuições você pode usar +%F %Tcomo atalho para +%Y-%m-%d %H:%M:%S. Observe que alguns sistemas de arquivos (tosse ** HFS) convertem o arquivo :para a /, fornecendo uma string como a 2016-09-15 11/05/00que é extremamente confusa.
beporter 15/09/16
24
A sintaxe preferida em qualquer shell compatível com POSIX neste milênio é em date=$(date)vez de date=`date`. Além disso, não use maiúsculas para suas variáveis ​​privadas; nomes de variáveis ​​em maiúsculas são reservados para o sistema.
tripleee
335

Tentar: $(date +%F)

Kwatford
fonte
12
As páginas de manual da data são:% F data completa; igual a% Y-% m-% d, portanto, essa é apenas uma notação mais compacta para a resposta aceita.
Håvard Geithus
92

Você pode fazer algo assim:

$ date +'%Y-%m-%d'
Desfazer
fonte
47

Você está procurando o formato de data padrão ISO 8601 ; portanto, se você tiver a data GNU (ou qualquer comando de data mais moderno que 1988), basta:$(date -I)

Medievalista
fonte
9
Eu tenho um computador Mac OS X recente (> 1988) e date -Inão funcionou. A instalação do coreutils GNU usando o brew (que usa o prefixo 'g') gdate -Ifuncionou.
Joel Purra
3
Ímpar. Não consigo encontrar a -Iopção documentada para o GNU date, embora com certeza pareça equivalente date +%F.
chepner
3
O OS X geralmente é um terreno baldio da GPL v3, portanto eles podem não ter a data de atualização ou o BASH recentemente.
Indolering
20
date -d '1 hour ago' '+%Y-%m-%d'

A saída seria 2015-06-14.

xu2mao
fonte
3
Errado por alguns motivos, obviamente isso indica a data errada entre 00:00 e 01:00 e, além de você terminar com a %.
Gerhard Burger
não é verdade. deve ser como esta citação única esparsa
Beyhan Gül
20
$(date +%F_%H-%M-%S)

pode ser usado para remover dois pontos (:) entre

resultado

2018-06-20_09-55-58
ahmettolga
fonte
19

Com o Bash recente (versão ≥ 4.2), você pode usar o built-in printfcom o modificador de 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é muito mais rápido do que datedesde que é um Bash, enquanto dateé um comando externo.

Além disso, printf -v date ...é mais rápido do que date=$(printf ...)já que não requer bifurcação.

wjandrea
fonte
4
Como uma observação em 2019, esse comando é incrivelmente mais rápido * do que datese você já estiver usando isso em um script bash, pois não precisa carregar nenhuma biblioteca extra. (* I medido no meu servidor linux diferença a ~ 160x velocidade de mais de 1000 iterações)
timtj
@timtj Obrigado por apontar isso! Eu adicionei algumas notas sobre velocidade à resposta.
wjandrea 24/05/19
1
Eu gostaria de poder +5 pelo comentário sobre printf -v datenão bifurcar um subshell. Muito boa informação !!
timtj 26/05/19
Normalmente eu uso date porque também preciso incrementar algumas datas. A data de impressão pode ser aritmética?
Merlin
1
@Merlin Eu não penso assim
wjandrea
8

Sempre que tenho uma tarefa como essa, acabo voltando a

$ man strftime

para me lembrar de todas as possibilidades.

arp
fonte
7

se você deseja o ano em um formato de dois números, como 17, em vez de 2017, faça o seguinte:

DATE=`date +%d-%m-%y`
Crt
fonte
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

Aqui x é a data da amostra usada e, em seguida, o exemplo exibe a formatação dos dados e a obtenção de datas 10 minutos a mais que a data atual.

ankitbaldua
fonte
6

Eu uso a seguinte formulação:

TODAY=`date -I`
echo $TODAY

Confira a página de manual date, há várias outras opções úteis:

man date
Luís de Sousa
fonte
5

Eu uso $(date +"%Y-%m-%d") ou $(date +"%Y-%m-%d %T")com hora e horas.

Miguel
fonte
1

Você pode definir a data como variável de ambiente e depois você pode usá-la

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

ou

DATE =`date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"
Farid Haq
fonte