Comment spécifiez-vous un format pour l'entrée à ce jour?

19

Étant donné une date et une heure dans un format qui n'est pas reconnu par date, comment puis-je datereconnaître la date et l'heure?

Par exemple:

$ 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

--magic-optionExiste- t- il? Sinon, existe-t-il un moyen plus élégant de résoudre ce problème plutôt que d'utiliser sedpour transformer l'entrée en une chaîne de date bien formée?

Cory Klein
la source
Voir aussi: Validation de la date dans le shell
don_crissti

Réponses:

10

Ni POSIX ni GNU date --magic-option. FreeBSD l'appelle -f(avec une syntaxe similaire aux datespécificateurs de format de sortie de, pas celle que vous proposez).

Votre date est très proche d'être reconnue par GNU date: il suffit de remplacer les deux points qui séparent la date de l'heure par un espace.

date -d "$(echo "09SEP2012:23:58:46" | sed 's/:/ /')"
Gilles 'SO- arrête d'être méchant'
la source
1
et avec des formats personnalisés? La seule voie à suivre sont les expressions régulières? c'est horrible :-(
phil294
1
Vous ne pouvez pas analyser les dates sans savoir quelque chose sur le format dans lequel elles se trouvent, l'exemple classique étant 01/02/03.
Gilles 'SO- arrête d'être méchant'
5

J'ai écrit un tas d'outils ( dateutils ) qui traitent les dates et les heures d'une manière plus conviviale pour les scripts. Votre option magique est --input-format|-ipar exemple:

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

Bien qu'il dconvne prenne pas directement en charge datele format de sortie de (il ne confère TZrien ou quoi que ce soit dans l'environnement), il y a un outil strptimedans dateutils qui prend en charge le %Zspécificateur de format.

hroptatyr
la source