Data de força para ler Dia / Mês / Ano

3

Como obtenho o comando GNU date para interpretar datas no formato 'dd / mm / aaaa', por exemplo:

O que eu recebo:

$ date  -d '09/07/2016'
Wed, Sep  7, 2016 12:00:00 AM

O que eu quero:

$ date  -d '09/07/2016'
Sat, Jul  9, 2016 12:00:00 AM

Eu tentei definir LC_ALL , mas sem sucesso.

    
por DarkHeart 15.07.2016 / 07:51

4 respostas

4

Observe que date -d é uma extensão do GNU. A sintaxe esperada é fixa e independente da localidade. Em particular, não usa POSIX getdate() para analisar a data (mesmo que a interface GNU date use também seja chamada de getdate() ).

Algumas compilações de algumas versões do busybox também reconhecem uma opção -d , mas o intervalo de formatos suportados é mais restrito. Em particular, não reconhece mm/dd/YYYY . Você pode, no entanto, passar uma opção -D <strptime-format> (obrigado @BinaryZebra) para especificar o formato que você gosta:

$ date -D %d/%m/%Y -d 01/10/2016
Sat Oct  1 00:00:00 BST 2016

AT & T ( ast-open ) date , desde 1995, também suporta uma opção -d no estilo GNU . Aquele usa POSIX getdate() . Portanto, com essa implementação de date , você pode usar a variável DATEMSK para alterar a maneira como as datas são analisadas e, desde 1996, você pode usar the -p option para passar um formato de análise de estilo strptime na linha de comando:

$ date --version
  version         date (AT&T Research) 2011-01-27
$ date -d 01/10/2016
Sun Jan 10 13:36:39 GMT 2016
$ date -d 01/10/2016 -p %d/%m/%Y
Sat Oct  1 13:36:51 BST 2016

O AT & T ksh93 ' printf %T também usa uma API getdate() -compatível e, portanto, também pode ser afetado pela variável DATEMSK , portanto, no ksh93, você pode fazer:

$ DATEMSK=/dev/stdin <<< %d/%m/%Y printf '%T\n' 01/10/2016
Sat Oct  1 13:47:06 BST 2016

Para analisar uma data portável em um script zsh , você pode usar o strftime builtin (após carregá-lo) com a opção -r :

$ zmodload zsh/datetime
$ strftime -s REPLY -r '%d/%m/%Y' 09/07/2016
$ strftime %c $REPLY
Sat 09 Jul 2016 00:00:00 BST
zsh strftime -r usa POSIX strptime() para analisar a sequência. Como tal, é dependente do local. Em uma localidade francesa, por exemplo, você pode usar strftime -r %d-%b-%Y 14-juillet-2016 para analisar uma data em francês.

Algumas implementações de strptime() como o GNU ainda aceitam os nomes de mês / dia em inglês quando em localidades diferentes do inglês, mas não em todos (o Solaris 11 não o faz por exemplo). Algo a ter em mente ao analisar uma data em inglês na localidade do usuário.

As versões recentes de bash também possuem um estilo de% kshprintf '%(format)T', mas esse não tem capacidade de análise de tempo.

Para ser completo, nos BSDs, date aceita um -f <strptime-format> que você pode usar em combinação com -j para reformatar uma data:

$ date -jf %d/%m/%Y 01/10/2016
Sat Oct  1 13:47:06 BST 2016
    
por 15.07.2016 / 10:54
2

Usar a data do busybox parece ser a escolha certa:

$ busybox date -uD '%d/%m/%Y' -d '09/07/2016'
Sat Jul  9 00:00:00 UTC 2016

Isso funciona porque a data do busybox aceita um formato ( -D ) para ler a data em -d .

Para tornar o comando mais confiável e criar o formato exato que você solicita:

$ LC_ALL=C busybox date -uD '%d/%m/%Y' -d '09/07/2016' +'%a, %b %d, %Y %r'
Sat, Jul 09, 2016 12:00:00 AM

Comando de data do Busybox .

    
por 16.07.2016 / 08:38
1

De info date

For numeric months, the ISO 8601 format YEAR-MONTH-DAY is allowed
When months are written literally, the calendar date may be given as any of the following:

 DAY MONTH YEAR
 DAY MONTH
 MONTH DAY YEAR
 DAY-MONTH-YEAR

Portanto, regra principal

All these strings specify the same calendar date:

 1972-09-24     # ISO 8601.
 72-9-24        # Assume 19xx for 69 through 99,
                # 20xx for 00 through 68.
 72-09-24       # Leading zeros are ignored.
 9/24/72        # Common U.S. writing.
 24 September 1972
 24 Sept 72     # September has a special abbreviation.
 24 Sep 72      # Three-letter abbreviations always allowed.
 Sep 24, 1972
 24-sep-72
 24sep72

No caso, você pode usar o nome literal do mês ou reconstruir a string de data antes de alimentá-lo com date

  1. IFS='/' read d m y <<<09/07/2016 ; echo "$m/$d/$y"
  2. sed -r 's|([^/]*)/([^/]*)|/|' <<<09/07/2016
  3. tr '/' '\n' <<<09/07/2016 | tac | tr '\n' '-'
por 15.07.2016 / 10:23
-1

Use a opção de formato:

date -d 'date -d '09/07/2016' +"%d/%m/%Y"' +"%a, %b %-d, %Y 12:00:00 AM"
    
por 15.07.2016 / 08:19

Tags