¿Por qué estos 2 comandos de fecha dan resultados diferentes?

9
$ date -d "Apr 1 2016 - 1 month" +%B

me da "marzo", lo cual es genial: el mes anterior a abril es marzo. Si hago esto sin embargo:

$ date -d "$(date -d "Apr 1 2016") - 1 month" +%B

me da "febrero". Esto está causando un error en un código más complejo que tengo. ¿Por qué estos 2 comandos muestran resultados diferentes?

Tal
fuente
Ambos me dieronMarch
cuonglm
1
Como explicó Thomas, esto depende de su zona horaria. Mi horario de verano cambia el 13 de marzo; el suyo probablemente no, por lo que es posible que no vea este comportamiento en las mismas fechas, o posiblemente en absoluto si no tiene cambios de horario de verano.
Tal

Respuestas:

11

Puede ver el problema activando el rastreo de shell:

+ date -d 'Apr 1 2016 - 1 month' +%B
March
++ date -d 'Apr 1 2016'
+ date -d 'Fri Apr  1 00:00:00 EDT 2016 - 1 month' +%B
February

Cuando usa la salida del datecomando interno , es a principios de abril, y al restar un mes se encuentra con la discontinuidad debido al cambio EST / EDT:

+ date -d 'Fri Apr  1 00:00:00 EDT 2016 - 1 month'
Mon Feb 29 23:00:00 EST 2016

Sus resultados, por supuesto, variarán de acuerdo con la configuración de su zona horaria local. Activar el seguimiento mostrará la zona horaria (en mi caso, EDT).

La razón por la cual los resultados difieren es que, en este último caso, le ha dado más información y ha datehecho que su parámetro sea más específico , es decir, la hora específica del día. En la primera parte, eso no se especificó, dando datemás margen de maniobra sobre cómo determinar la fecha / hora para mostrar.

Thomas Dickey
fuente
Ahora me doy cuenta de que esto tiene que ver con el horario de verano (los míos están aquí: timeanddate.com/time/zone/canada/edmonton ), pero todavía no entiendo por qué el comando de fecha parece estar interpretando la misma fecha de manera diferente en un subshell que en el shell principal. Si ejecuto un script con:, date -d "Apr 1 2016"; date -d "$(date -d "Apr 1 2016")"obtengo exactamente el mismo resultado, incluida la misma etiqueta de zona horaria. ¿Por qué eliminar un mes de ambos da resultados diferentes?
Tal
Oh, tu última edición lo deja claro. Gracias
Tal