No meu sistema agora, por padrão, date
as saídas:
$ date
Fri 29 Jan 22:04:26 GMT 2016
No entanto, se eu tentar inserir datas nesse formato, date
isso resultará em "data inválida":
$ date -d "$(date)"
date: invalid date ‘Fri 29 Jan 22:06:14 GMT 2016’
Sei que posso escolher manualmente um formato que date
entenda:
$ date -d "@$(date +%s)"
Fri 29 Jan 22:08:03 GMT 2016
Mas estou interessado em saber por que ele está exibindo um formato que não aceita novamente.
Responder1
Passei cerca de duas horas procurando por essa resposta que me incomoda há anos e finalmente a encontrei!!
Por padrão, date
gera uma data no formato de localidade atual, como en_GB.UTF-8
ou en_AU.UTF-8
ou de_DE.UTF-8
etc.
Sua localidade padrão parece semelhante à minha e exibe datas no formato:
date_fmt "%a %e %b %H:%M:%S %Z %Y"
Infelizmente, este é um dos poucos formatos que o comando date não consegue entender. No entanto, sePosso entenderum formato muito semelhante
date_fmt "%a %e %b %Y %H:%M:%S %Z"
"Sexta-feira, 29 de janeiro de 2016 22:04:26 GMT" Funciona
"Sexta-feira, 29 de janeiro, 22:04:26 GMT 2016" Não
Por que os códigos de idioma en_GB.UTF-8 e en_AU.UTF-8 comumente usados usam um formato que date
não pode ser lido, eu não sei, mas é muito fácil ajustá-lo para que não incomode você novamente, pelo menos não até que você reinstale seu sistema ou suas definições sejam substituídas por uma atualização excessivamente zelosa >:-(
Como personalizar o formato de data da sua localidade em três etapas
Encontrei as seguintes informaçõesaqui:
1. Verifique qual localidade você está usando
Primeiro verifique qual localidade seu sistema está usando para o formato de hora e data
$ locale
LANG=en_AU.UTF-8
LANGUAGE=en_AU
LC_CTYPE="en_AU.UTF-8"
LC_NUMERIC=en_AU.UTF-8
LC_TIME=en_AU.UTF-8
LC_COLLATE="en_AU.UTF-8"
LC_MONETARY=en_AU.UTF-8
LC_MESSAGES="en_AU.UTF-8"
LC_PAPER=en_AU.UTF-8
LC_NAME=en_AU.UTF-8
LC_ADDRESS=en_AU.UTF-8
LC_TELEPHONE=en_AU.UTF-8
LC_MEASUREMENT=en_AU.UTF-8
LC_IDENTIFICATION=en_AU.UTF-8
LC_ALL=
Note oLC_TIME=entrada. O meu é inglês australiano:pt_AU.UTF-8o seu pode ser en_GB_UTF-8
2. Edite a definição de localidade
Abra um terminal e edite a definição de localidade apropriada
$ sudo nano /usr/share/i18n/locales/{LC_Time}
por exemplo
$ sudo nano /usr/share/i18n/locales/en_AU
Role para baixo até a seção LC_TIME, aqui está a minha:
LC_TIME
abday "Sun";"Mon";"Tue";"Wed";"Thu";"Fri";"Sat"
day "Sunday";/
"Monday";/
"Tuesday";/
"Wednesday";/
"Thursday";/
"Friday";/
"Saturday"
abmon "Jan";"Feb";/
"Mar";"Apr";/
"May";"Jun";/
"Jul";"Aug";/
"Sep";"Oct";/
"Nov";"Dec"
mon "January";/
"February";/
"March";/
"April";/
"May";/
"June";/
"July";/
"August";/
"September";/
"October";/
"November";/
"December"
d_t_fmt "%a %d %b %Y %T %Z"
d_fmt "%d//%m//%y"
t_fmt "%T"
am_pm "AM";"PM"
t_fmt_ampm "%I:%M:%S %p"
date_fmt "%a %e %b %Y %H:%M:%S %Z"
week 7;19971130;1
END LC_TIME
Tudo que você precisa alterar é a date_fmt
entrada
Eu mudei o meu de:
date_fmt "%a %e %b %H:%M:%S %Z %Y"
paradate_fmt "%a %e %b %Y %H:%M:%S %Z"
Salve o arquivo e saia do editor
3 Regenere sua localidade
Você recompila seus arquivos de definição de localidade com:
$ sudo locale-gen
É isso! Agora, o date
comando deve fornecer a saída em um formato que ele próprio possa aceitar nativamente como entrada
$ date -d "$(date)"
Mon 17 Aug 2020 17:58:37 AWST