web-dev-qa-db-fra.com

Comment convertir d'un format de date à un autre format?

J'ai un problème avec mon format de date. Je veux passer d'un format à l'autre et vice versa. Mes formats de date sont

Format 1

YYYY-MM-DD

Format 2

MM/DD/YYYY

Je souhaite changer de format 1 au format 2 et au format 2 au format 1.

11
AiB

Utilisez GNU 'date' pour cela. Il convertira également entre d'autres formats pour vous (voir date --help Pour la liste des formats).

$ date -d 2013-07-05 +%m/%d/%Y
07/05/2013
$ date -d 07/05/2013 +%F
2013-07-05
14
user4443

En supposant que vous avez des dates sous forme de texte qui doivent être converties

echo '2013-12-13' | awk -v FS=- -v OFS=/ '{print $2,$3,$1}'

Et vice versa

echo '12/13/2013' | awk -v FS=/ -v OFS=- '{print $3,$1,$2}'
6
iruvar
$ echo YYYY-MM-DD | { IFS=- read y m d && echo "$m/$d/$y"; }
MM/DD/YYYY

Si vous avez un fichier avec beaucoup de ces dates, un par ligne:

awk -F- -vOFS=/ '{print $2,$3,$1}' < that-file
3
Stéphane Chazelas

Répondre à la question clarifiée dans les commentaires sur la manière de modifier le format de date dans un nom de fichier, utilisez une variante de Drewbenn's gnu date approcher. Cette commande trouve tous les fichiers dans le dossier local et ne pipe que le nom du fichier sur xargs, substituant le nom de fichier date modifié comme deuxième argument à mv qui effectue le renommer.

L'utilisation supplémentaire légèrement détournée de la substitution variable bash est nécessaire comme bash évalue la commande date.

find ./ -printf '%f\n' | xargs -I '{}' sh -c 'mv $1  $(date -j -f %Y-%m-%d $1 +%m/%d%Y)' -- {} \;
0
Rob

Utiliser SED comme suit:

$ echo '2013-12-13' | sed -r 's/([[:digit:]]{2,4})-([[:digit:]]{1,2})-([[:digit:]]{1,2})/\2\/\3\/\1/g'
12/13/2013
$ echo '12/13/2013' | sed -r 's/([[:digit:]]{1,2})\/([[:digit:]]{1,2})\/([[:digit:]]{2,4})/\3-\1-\2/g'
2013-12-13
0
mark_infinite