Estoy tratando de usar el comando de fecha para generar una marca de tiempo de archivo que el comando de fecha en sí mismo puede interpretar. Sin embargo, al comando date no parece gustarle su propio resultado, y no estoy seguro de cómo solucionarlo. Caso en punto:
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
La fecha parece estar interpretando la cadena con un desplazamiento de 15 horas. ¿Hay alguna solución conocida para esto?
Editar: este no es un problema de visualización:
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
>>>
Todavía está apagado por 15 horas cuando se muestra como una marca de tiempo de Unix.
EDITAR # 1
Tal vez debería plantear esta pregunta un poco diferente. Digamos que tengo una lista de marcas de tiempo básicas ISO8601 del formulario:
- AAAAMMDDThhmm
- AAAAMMDDThhmmss
¿Cuál es la forma más sencilla de convertirlos a las marcas de tiempo Unix correspondientes?
Por ejemplo:
- 20140103T1422 = 1388787720
- 20140103T142233 = 1388787753
fuente
20140103T1518
no es válida ISO 8601, pierde la parte de zona horariaRespuestas:
Pide "soluciones conocidas". Aquí hay uno simple:
Esto utiliza
sed
para reemplazar "T" con un espacio. El resultado es un formato quedate
comprende.Si agregamos segundos a la fecha ISO8601, entonces se
date
requieren más cambios:En lo anterior,
sed
reemplaza la "T" con un espacio y también separa HHMMSS en HH: MM: SS.fuente
Los documentos de información de coreutils dicen que el "formato extendido" ISO 8601 es compatible.
Deberá agregar guiones, dos puntos y una
+%z
para que funcione.Para responder a su segunda parte de la pregunta ...
Dado que el formato de fecha solo contiene números y símbolos, puede reemplazar cada símbolo con una letra única, por ejemplo, utilizando
tr
O podría analizarlo usando los separadores
T
y el-
o+
como, por ejemplo, usando shell${var%word}
y${var#word}
expansióno usando
bash
la coincidencia de expresiones regulareso Perl, Python, etc. etc.
fuente
Los coreutils de GNU solo han admitido fechas ISO 8601 como entrada desde la versión 8.13 (lanzada el 2011-09-08). Debes estar usando una versión anterior.
En versiones anteriores, debe reemplazarlo
T
por un espacio. De lo contrario, se interpreta como una zona horaria militar de los EE . UU .Incluso en versiones recientes, solo se reconoce la forma totalmente puntuada, no el formato básico con solo dígitos y una
T
en el medio.fuente
Noté esta nota en la página del manual para
date
.No es concluyente, pero no muestra explícitamente una cadena de formato de hora que incluya lo
T
que está intentando, para [ISO 8601]. Como indicó la respuesta de @Gilles , el soporte de ISO 8601 en GNU CoreUtils es relativamente nuevo.Volver a formatear la cadena
Puedes usar Perl para reformular tu cadena.
Ejemplo:
Puede hacer que esto maneje tanto las cadenas que incluyen segundos como las que no.
20140103T1422:
20140103T142233:
fuente
De acuerdo con la página de manual de fecha, el formato que genera no es el mismo que el que se
date
espera como entrada. Esto es lo que dice la página del manual:Entonces podrías hacerlo así:
Porque en las variables que se utilizan para definir la cadena de salida,
+%m%d%H%M%Y
sería igual a lo que espera como entrada.fuente