Como você especifica um formato para a entrada até a data?


19

Dada uma data e hora em um formato que não é reconhecido por date, como posso datereconhecer a data e a hora?

Por exemplo:

$ date -d "09SEP2012:23:58:46"
date: invalid date `09SEP2012:23:58:46'
$ date -d "09SEP2012:23:58:46" --magic-option "ddMMMYYY:hh:mm:ss"
Sun Sep  9 23:58:46 MDT 2012

Existe --magic-option? Caso contrário, existe uma maneira mais elegante de resolver isso em vez de usar sedpara transformar a entrada em uma sequência de datas bem formada?


Respostas:


10

Nem a data POSIX nem a GNU têm --magic-option. O FreeBSD chama isso -f(com uma sintaxe semelhante aos dateespecificadores de formato de saída, e não a que você propõe).

Sua data está muito perto de ser reconhecida pela data do GNU: basta substituir os dois pontos que separam a data da hora por um espaço.

date -d "$(echo "09SEP2012:23:58:46" | sed 's/:/ /')"

1
e com formatos personalizados? O único caminho a seguir são expressões regulares? Isso é horrível :-(
phil294

1
Você não pode analisar datas sem saber algo sobre o formato em que estão, o exemplo clássico 01/02/03.
Gilles 'SO- stop be evil'

5

Eu escrevi um monte de ferramentas ( dateutils ) que lidam com datas e horas de uma maneira mais amigável ao script. Sua opção mágica existe --input-format|-i, por exemplo:

dconv -i '%d%b%Y:%H:%M:%S' "09SEP2012:23:58:46"
=>
  2012-09-09T23:58:46

Embora dconvnão suporte diretamente dateo formato de saída (não confere TZnada no ambiente), há uma ferramenta strptimeno dateutils que suporta o %Zespecificador de formato.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.