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

20140103T1518no es válida ISO 8601, pierde la parte de zona horariaRespuestas:
Pide "soluciones conocidas". Aquí hay uno simple:
Esto utiliza
sedpara reemplazar "T" con un espacio. El resultado es un formato quedatecomprende.Si agregamos segundos a la fecha ISO8601, entonces se
daterequieren más cambios:En lo anterior,
sedreemplaza 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
+%zpara 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
trO podría analizarlo usando los separadores
Ty el-o+como, por ejemplo, usando shell${var%word}y${var#word}expansióno usando
bashla 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
Tpor 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
Ten 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
Tque 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
dateespera 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%Ysería igual a lo que espera como entrada.fuente