Restando fechas en Unix

Restando fechas en Unix

¿Existe alguna forma en Unix de restar un mes o al menos 30 días de una fecha específica? La fecha debe ser ingresada por el usuario.

Ejemplo:

2012-11-19 - 1 mes = 2013-10-19

Éste no funciona:

date -d '2013-10-13 - 1 month' '+%F'

Respuesta1

La forma más sencilla es convertir la fecha a un valor time_t de Unix (es decir, segundos desde el comienzo de la época, o '1-1-1970 00:00:00'), y luego restar 30 días * 86400 segundos por día de ese número.

Por ejemplo, el siguiente ejemplo lo utiliza set -xpara que pueda ver el valor de la variable D a medida que cambia.

#! /bin/ksh

set -x

D=$(date -d '2013-10-13' '+%s')
D=$((D - 30 * 86400))

date -d "@$D"

Tenga en cuenta que esto depende de la versión GNU datede GNU Coreutils. Es posible que otras versiones de date no admitan la conversión de un valor time_t a una fecha formateada con @. A menos que haya instalado GNU coreutils, probablemente esto no esté disponible en su sistema AIX, por lo que gawkprobablemente sea su mejor opción para volver a convertir a una fecha formateada:

echo "$D" | gawk '{print strftime("%c", $0)}'

Mi respuesta original aquí sugería simplemente awk, pero pruebas adicionales en mi sistema Debian han revelado que ninguno de los mawkdos original-awktiene la strftimefunción incorporada, por lo que tendrás que instalar GNU Coreutils o GNU Awk.

Si perl está instalado en el sistema, se puede utilizar perl en lugar de awk:

echo $D | perl -nE 'say scalar gmtime $_'

Hay varios métodos alternativos y ejemplos de cómo hacer esto en:

https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line

Respuesta2

Prueba esto:

date --date="$(date -d "Nov 1 2012")-1 month" +'%Y:%m:%d'
2012:10:01

El 1 de noviembre de 2012 se utiliza como ilustración. Puede ser de cualquier fecha de entrada del usuario.

Respuesta3

Su ejemplo utiliza elementos relativos en cadenas de fecha que son una extensión de fecha GNU.

Por ejemplo, en Fedora 19 su ejemplo funciona como se esperaba:

$ date -d '2013-10-13 - 1 month' '+%F'
2013-09-13

Por lo tanto, puede asegurarse de que su secuencia de comandos utilice la fecha GNU.

Respuesta4

Prueba esto.

DAY30=`TZ=EST+720 date "+%Y-%m-%d"`

print $DAY30

720 es el desplazamiento en horas. Entonces, 30 días son 720 horas.

EST es mi zona horaria. Supongo que puedes usar cualquier zona horaria que sea apropiada.

información relacionada