J'essaie d'utiliser la commande date pour générer un horodatage de fichier que la commande date elle-même peut interpréter. Cependant, la commande date ne semble pas aimer sa propre sortie, et je ne sais pas comment contourner cela. Exemple concret:
sh-4.2$ date
Fri Jan 3 14:22:19 PST 2014
sh-4.2$ date +%Y%m%dT%H%M
20140103T1422
sh-4.2$ date -d "20140103T1422"
Thu Jan 2 23:22:00 PST 2014
date semble interpréter la chaîne avec un décalage de 15 heures. Existe-t-il des solutions connues à cela?
Edit: ce n'est pas un problème d'affichage:
sh-4.2$ date +%s
1388791096
sh-4.2$ date +%Y%m%dT%H%M
20140103T1518
sh-4.2$ date -d 20140103T1518 +%s
1388737080
sh-4.2$ python
Python 3.3.3 (default, Nov 26 2013, 13:33:18)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 1388737080 - 1388791096
-54016
>>> 54016/3600
15.004444444444445
>>>
Il est toujours éteint de 15 heures lorsqu'il est affiché sous forme d'horodatage Unix.
EDIT # 1
Je devrais peut-être poser cette question un peu différemment. Disons que j'ai une liste d'horodatages de base ISO8601 de la forme:
- YYYYMMDDThhmm
- YYYYMMDDThhmmss
Quelle est la manière la plus simple de les convertir en horodatages Unix correspondants?
Par exemple:
- 20140103T1422 = 1388787720
- 20140103T142233 = 1388787753
shell-script
date
alex.forencich
la source
la source
20140103T1518
n'est pas valide ISO 8601, il manque la partie du fuseau horaireRéponses:
Vous demandez des «solutions de contournement connues». En voici une simple:
Cela permet
sed
de remplacer "T" par un espace. Le résultat est un format quidate
comprend.Si nous ajoutons des secondes à la date ISO8601, cela
date
nécessite plus de changements:Dans ce qui précède,
sed
remplace le "T" par un espace et sépare également HHMMSS en HH: MM: SS.la source
La documentation info coreutils indique que le "format étendu" ISO 8601 est pris en charge.
Vous devrez ajouter des tirets, des deux-points et un
+%z
pour le faire fonctionner.Pour répondre à votre deuxième partie de la question ...
Étant donné que le format de date ne contient que des chiffres et des symboles, vous pouvez remplacer chaque symbole par une lettre unique, par exemple en utilisant
tr
Ou vous pouvez l'analyser en utilisant le
T
et le-
ou+
comme séparateurs, par exemple en utilisant le shell${var%word}
et l'${var#word}
expansionou en utilisant
bash
la correspondance d'expressions régulièresou Perl, Python, etc. etc.
la source
GNU coreutils ne prend en charge les dates ISO 8601 qu'en entrée depuis la version 8.13 (publiée le 2011-09-08). Vous devez utiliser une ancienne version.
Sous les anciennes versions, vous devez remplacer le
T
par un espace. Sinon, il est interprété comme un fuseau horaire militaire américain .Même sous les versions récentes, seule la forme entièrement ponctuée est reconnue, pas le format de base avec seulement des chiffres et un
T
au milieu.la source
J'ai remarqué cette note dans la page de manuel de
date
.Ce n'est pas concluant, mais il n'affiche pas explicitement une chaîne de format d'heure qui inclut le
T
comme vous essayez, pour [ISO 8601]. Comme indiqué dans la réponse de @Gilles , la prise en charge d' ISO 8601 dans GNU CoreUtils est relativement nouvelle.Reformater la chaîne
Vous pouvez utiliser Perl pour reformuler votre chaîne.
Exemple:
Vous pouvez rendre cette poignée à la fois des chaînes qui incluent des secondes et celles qui ne le font pas.
20140103T1422:
20140103T142233:
la source
Selon la page de manuel de date, le format que vous sortez n'est pas le même que celui
date
attendu en entrée. Voici ce que dit la page de manuel:Vous pouvez donc le faire comme ceci:
Parce que dans les variables qui sont utilisées pour définir la chaîne de sortie,
+%m%d%H%M%Y
serait égale à ce qu'elle attend en entrée.la source