Obtenha "date" para entender uma frase de timestamp de um idioma diferente

5

Meus scripts de captura da web há muito tempo gostavam de usar date -d para ler carimbos de data e hora em formato humano como "11 de março de 1999" e convertê-los para qualquer outro formato necessário por meio do parâmetro -s.

Como posso entender as datas impressas em outras localidades, como 27 Kwi, 13:54 em polonês ? Eu posso acrescentar / acrescentar o ano (2012), se necessário.

Eu verifiquei meu env e tentei o seguinte, mas sem sorte:

LOCALE=PL date -d "30 Kwi, 17:02"
LANGUAGE=pl_PL:pl date -d "30 Kwi, 17:02"
LC_CTYPE=pl_PL:pl date -d "30 Kwi, 17:02"
LANG=pl_PL:pl date -d "30 Kwi, 17:02"
LC_COLLATE=pl_PL:pl date -d "30 Kwi, 17:02"
LC_MESSAGES=pl_PL:pl date -d "30 Kwi, 17:02"
date: invalid date '30 Kwi, 17:02'

No meu sistema como instalado,

LANGUAGE=en_US:en
LC_CTYPE=en_US.UTF-8
LC_MESSAGES=en_US.UTF-8
LC_COLLATE=en_US.UTF-8
    
por Marcos 01.05.2012 / 10:55

1 resposta

5

Infelizmente você não pode.

GNU coreutils - Sintaxe de data geral

In the current implementation, only English is supported for words and abbreviations like ‘AM’, ‘DST’, ‘EST’, ‘first’, ‘January’, ‘Sunday’, ‘tomorrow’, and ‘year’.

Como não consigo encontrar uma maneira de usar date ou qualquer outra ferramenta como essa, veja como você pode fazer isso em Python.

import time
import locale

locale.setlocale(locale.LC_TIME, 'pl_PL')

logtime = time.strptime('30 Kwi 2012, 17:02', '%d %b %Y, %H:%M')

Você pode usar o strptime em qualquer idioma que o forneça, por exemplo, Python , Perl , C , < a href="http://www.ruby-doc.org/stdlib-1.9.3/libdoc/date/rdoc/DateTime.html#method-c-strptime"> Ruby , etc.

Se você realmente tiver que usar apenas bash , tente isto:

# create an associative array, e.g. month[kwi] = 4
# requires bash >= 4
declare -A month
for m in {1..12}; do
  # any year should do since we only print the month
  mmm=$(LC_TIME=pl_PL.UTF-8 date -d "2000-$m-1" "+%b")
  month[$mmm]=$m
done

# test that the associative array works, should print 4
echo ${month[kwi]}

# given arguments <day> <month> <year>, <hour>:<minute>
# where month is a three-letter abbreviated Polish month name
# print it using the system's default date format
pl_date() {
  local d=$1
  local mmm=$2
  local yyyy=$3
  local hhmm=$4

  local m=${month[$mmm]}
  date -d "$yyyy-$m-$d $hhmm"
}

# use without quotes
pl_date 30 kwi 2012 17:02

Notas:

Mesmo em inglês, o ano é obrigatório e a vírgula não é permitida:

$ date -d "30 Apr, 17:02"
date: invalid date '30 Apr, 17:02'

$ date -d "30 Apr 2012 17:02"
Mon Apr 30 17:02:00 PDT 2012

Apenas LANGUAGE suporta uma lista como pl_PL:pl , as outras variáveis requerem um único nome, por ex. pl_PL ou pl_PL.UTF-8 .

    
por 01.05.2012 / 16:03