¿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 -x
para 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 date
de 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 gawk
probablemente 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 mawk
dos original-awk
tiene la strftime
funció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.