Jak określasz format danych wejściowych do tej pory?

19

Biorąc pod uwagę datę i godzinę w formacie, który nie jest rozpoznawany przez date, jak mogę daterozpoznać datę i godzinę?

Na przykład:

$ 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

Czy --magic-optionistnieje Jeśli nie, to czy istnieje bardziej elegancki sposób na rozwiązanie tego problemu niż użycie sedtransformacji danych wejściowych w dobrze uformowany ciąg daty?

Cory Klein
źródło
Zobacz także: Sprawdzanie poprawności daty w powłoce
don_crissti

Odpowiedzi:

10

Nie ma daty POSIX ani GNU --magic-option. FreeBSD nazywa to -f(ze składnią podobną do datespecyfikatorów formatu wyjściowego, a nie tą, którą proponujesz).

Twoja data jest bardzo bliska rozpoznania przez datę GNU: wystarczy zastąpić dwukropek oddzielający datę od czasu spacją.

date -d "$(echo "09SEP2012:23:58:46" | sed 's/:/ /')"
Gilles „SO- przestań być zły”
źródło
1
i z niestandardowymi formatami? Jedynym wyjściem są wyrażenia regularne? to jest okropne :-(
phil294
1
Nie można parsować dat bez wiedzy o formacie, w jakim się znajdują, czego przykładem jest klasyczny 01/02/03.
Gilles „SO - przestań być zły”,
5

Napisałem kilka narzędzi ( dateutils ), które radzą sobie z datami i godzinami w sposób bardziej przyjazny skryptom . Twoja magiczna opcja to --input-format|-inp .:

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

Chociaż dconvnie obsługuje bezpośrednio dateformatu wyjściowego (nie nadaje się TZani niczego w środowisku), strptimew dateutils znajduje się narzędzie, które obsługuje specyfikator %Zformatu.

hroptatyr
źródło