Las matemáticas de fecha no dan el resultado esperado

Las matemáticas de fecha no dan el resultado esperado

He visto varios ejemplos (incluido estecorreo) y parece bastante simple, pero no entiendo lo que estoy haciendo mal (sé que esa publicación es para Linux, pero lo intenté con el datecomando en una máquina Linux y obtuve el mismo resultado allí)

Un ejemplo de comando y salida

me@mymachine~$ gdate -d '2019-10-19 01:37:02 +7 days' +"%Y-%m-%d %H:%M:%S"
2019-10-19 14:37:02

Esperaba que el resultado comenzara con 2019-10-26. Entonces parece que no está analizando mi entrada, ¿verdad?

Lo que es aún más extraño (para mí de todos modos) es que si quito la parte de tiempo de la entrada, funciona como se esperaba.

me@mymachine~$ gdate -d '2019-10-19 +7 days' +"%Y-%m-%d %H:%M:%S"
2019-10-26 00:00:00

Respuesta1

Análisis

Hice algunas pruebas en Debian 9, estudié man 1 datey info date. Este último contiene más información sobre cómo 2019-10-19 01:37:02 +7 daysse interpretan las cadenas similares.

Notas preliminares:

  • Mi respuesta usa dateporque esta es la herramienta en Debian. (Úselo alias date=gdatepara probar mis comandos gdatesin editarlos cada vez).
  • Parece que su zona horaria es aproximadamente equivalente a TZ=UTC+4.

Intenté replicar tu resultado:

$ date -d '2019-10-19 01:37:02 +7 days' +"%Y-%m-%d %H:%M:%S"
2019-10-19 20:37:02

Mi resultado es diferente, esto indica que las zonas horarias importan. Para replicar realmente su resultado:

$ TZ=UTC+4 date -d '2019-10-19 01:37:02 +7 days' +"%Y-%m-%d %H:%M:%S"
2019-10-19 14:37:02

Explicación

Resulta +7que su comando de "mal comportamiento" se interpreta como UTC+7y daysse interpreta como +1 days. Comparar:

$ TZ=UTC+4 date -d '2019-10-19 01:37:02 UTC+7 +1 days' +"%Y-%m-%d %H:%M:%S"
2019-10-19 14:37:02

(Nota TZ=UTC+4significaUTC-04:00mientras que UTC+7en la cadena significaUTC+07:00. Se explica la inconsistencia con los signos.aquí.)

El misterioso resultado ya no lo es tanto.


Capricho

Lo que es realmente extraño es esto:

$ TZ=UTC+4 date -d '2019-10-19 01:37:02 UTC+7 days' +"%Y-%m-%d %H:%M:%S"
2019-10-25 21:37:02

Aparentemente no es UTC+7y days(es decir, +1 dayscomo arriba) sino UTC(es decir UTC+0,) y +7 days:

$ TZ=UTC+4 date -d '2019-10-19 01:37:02 UTC+0 +7 days' +"%Y-%m-%d %H:%M:%S"
2019-10-25 21:37:02

Solución

Mueva la +7 dayssubcadena hacia el principio, para que aparezca antes 01:37:02. Esta forma +7no se interpretará como UTC+7:

$ date -d '2019-10-19 +7 days 01:37:02' +"%Y-%m-%d %H:%M:%S"
2019-10-26 01:37:02

Ahora 01:37:02en la cadena de entrada se interpreta según la zona horaria que datese considere correcta. El resultado* debería ser el mismo para mí en Europa, para mis compañeros usuarios en Estados Unidos, Australia y en cualquier lugar. Por eso lo dejé TZ=UTC+4, ya no importa.

*Me refiero acadena de caracteresimpreso por datedebe ser el mismo. Diferentes usuarios interpretarán la misma cadena en diferentes zonas horarias y obtendrán diferentes momentos en la realidad. En este sentido sus resultados son diferentes. En el mismo sentido sus aportaciones son diferentes.

información relacionada