Como especificar o formato de data para a função

0

Eu entendo que o comando date -d "20170712" valida e retorna a data em forma de string como Wed Jul 12 00:00:00 PDT 2017 .

As perguntas que tenho são:

  1. Como a data sabe o formato em que dei a string (neste caso, Ano como 2107, Mês como julho e Dia como 12)?

  2. E se eu quiser passar "20171307" e quiser dizer à função que dia é 13 e mês é Jul?

  3. Existe uma maneira de especificar o formato da string que eu passo para o comando date ?

por AlluSingh 13.07.2017 / 12:20

3 respostas

2

O GNU date faz o possível para analisar sua entrada, mas alguns formatos são inerentemente ambíguos.

O BSD date permite (ou praticamente requer) que você especifique um formato de entrada com -f e depois simplesmente analisa sua entrada de acordo com isso, emitindo um erro se a entrada não corresponder ao formato.

Esperar ou exigir ferramentas padrão para suportar um formato de data ilógico e aleatório como o seu parece mal direcionado, de qualquer maneira. As ferramentas padrão devem suportar formatos padrão, e acho que você vai achar que, no longo prazo, faz sentido que seus scripts e programas usem um formato de computador interno. Para fazer interface com humanos com comportamentos estranhos, é fácil escrever uma função simples de invólucro de shell como

Wackydate () {
    local day  # local is a Bashism
    local mon
    local year
    year=${1%????}
    mon=${1#$year??}
    day=${1#$year}
    day=${day%$mon}
    shift
    date -d "$year$mon$day" "$@"
}

As substituições de parâmetro do shell ${variable#prefix} e ${variable%suffix} retornam o valor de variable com qualquer correspondência de caractere curinga na expressão após # ou % removidas no início ou no final, respectivamente.

    
por 13.07.2017 / 14:38
1

Por favor, oh Por favor, não faça isso.

Em geral, a saída de data é controlada por LC_TIME variable

$ LC_TIME=ja_JP.utf8 date; date'
2017年  7月 13日 木曜日 18:00:22 EDT
Thu Jul 13 18:00:22 EDT 2017

E pode ser muito (e eu quero dizer: realmente muito) difícil analisar uma cadeia de data, mesmo que pareça natural e óbvio para o leitor.

Como o formato do Japão acima.

Poderia não ser usado como entrada para o comando date.

Você pode editar o arquivo de localidade para atender às suas necessidades e até torná-lo o padrão.

First, a quote:

 Our units of temporal measurement, from seconds on up to months,
 are so complicated, asymmetrical and disjunctive so as to make
 coherent mental reckoning in time all but impossible.  Indeed, had
 some tyrannical god contrived to enslave our minds to time, to make
 it all but impossible for us to escape subjection to sodden
 routines and unpleasant surprises, he could hardly have done better
 than handing down our present system.  It is like a set of
 trapezoidal building blocks, with no vertical or horizontal
 surfaces, like a language in which the simplest thought demands
 ornate constructions, useless particles and lengthy
 circumlocutions.  Unlike the more successful patterns of language
 and science, which enable us to face experience boldly or at least
 level-headedly, our system of temporal calculation silently and
 persistently encourages our terror of time.

 ... It is as though architects had to measure length in feet, width
 in meters and height in ells; as though basic instruction manuals
 demanded a knowledge of five different languages.  It is no wonder
 then that we often look into our own immediate past or future, last
 Tuesday or a week from Sunday, with feelings of helpless confusion.
 ...

—Robert Grudin, ‘Time and the Art of Living’.

Respostas:

  1. Porque está em conformidade com o formato de data ISO-8601 .
    Que poderia ser impresso assim:

    $ date -Id -d 20170713 
    
  2. Sim, você pode usar um formato tão estranho (com data de busybox ou data de BSD):

    $ busybox date -D '%Y%d%m' -d "20171307"
    Thu Jul 13 00:00:00 EDT 2017
    

    E até mesmo imprimi-lo no mesmo formato:

    $ busybox date -D '%Y%d%m' -d "20171307" +'%Y%d%m'
    20171307
    
  3. Sim, você pode fornecer um formato e, acima, em 2 é um exemplo.

por 14.07.2017 / 00:23
0

Na verdade, tudo depende da versão do date que você está usando.

O GNU date espera que a data de entrada seja yy[y]*mmdd como em 20170713 (13 de julho de 2017) ou 1000901123 (23 de novembro de 100090, sim, o ano é faaaar no futuro ;-)). Ele imprime datas de forma confiável até 10 dixits, não tem certeza do que faz por anos além desse ... ano como 2140000000 funciona, ano 2150000000 não funciona no meu sistema.

Você também pode usar expressões humanas como date -d 'yesterday' , novamente, não portáteis.

Use sed para reorganizar sua data para yyyymmdd .

    
por 13.07.2017 / 14:02

Tags