¿Cómo se especifica un formato para la entrada hasta la fecha?

19

Dada una fecha y hora en un formato que no es reconocido por date, ¿cómo puedo llegar datea reconocer la fecha y la hora?

Por ejemplo:

$ 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

¿Existe --magic-option? Si no, ¿hay una manera más elegante de resolver esto en lugar de usar sedpara transformar la entrada en una cadena de fecha bien formada?

Cory Klein
fuente
Ver también: Validación de fecha en shell
don_crissti

Respuestas:

10

Ni POSIX ni GNU tienen fecha --magic-option. FreeBSD lo llama -f(con una sintaxis similar a datela de los especificadores de formato de salida, no la que usted propone).

Su fecha está muy cerca de ser reconocida por la fecha GNU: todo lo que se necesita es reemplazar los dos puntos que separan la fecha del tiempo por un espacio.

date -d "$(echo "09SEP2012:23:58:46" | sed 's/:/ /')"
Gilles 'SO- deja de ser malvado'
fuente
1
y con formatos personalizados? ¿El único camino a seguir son las expresiones regulares? esto es horrible :-(
phil294
1
No puede analizar las fechas sin saber algo sobre el formato en el que están, siendo el ejemplo clásico 01/02/03.
Gilles 'SO- deja de ser malvado'
5

Escribí un montón de herramientas ( dateutils ) que tratan las fechas y horas de una manera más amigable con los scripts. Su opción mágica es --input-format|-i, por ejemplo:

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

Si bien dconvno admite directamente dateel formato de salida (no confiere TZni nada en el entorno), hay una herramienta strptimeen dateutils que admite el %Zespecificador de formato.

hroptatyr
fuente