¿Cómo obtengo la fecha de finalización del mes anterior, según la fecha de procesamiento?
Ejemplos:
- Fecha de procesamiento = 15jan2015
- Fecha esperada = 31dec2014,
- Fecha de procesamiento = 10feb2015
- Fecha esperada = 31jan2015
¿Cómo obtengo la fecha de finalización del mes anterior, según la fecha de procesamiento?
Ejemplos:
Respuestas:
Con GNU date:
$ date +%d%b%Y
16Aug2015
$ date -d "$(date +%Y-%m-01) -1 day" +%d%b%Y
31Jul2015
Algunos shells tienen soporte incorporado para la manipulación de fechas:
Con ksh93:
$ printf "%(%d%b%Y)T\n" "1st day, yesterday"
31Jul2015
Con zsh:
$ zmodload zsh/datetime
$ strftime -s d %Y-%m-01-12 $EPOCHSECONDS
$ strftime -rs d %Y-%m-%d-%H $d
$ strftime %d%b%Y $((d-86400))
31Jul2015
Hay muchas maneras de hacer esto; Aquí es el más simple que encontré (aquí suponiendo GNU date):
$ date -d "-$(date +%d) days"
Fri Jul 31 16:07:23 EDT 2015
TZ=Pacific/Apia faketime '2011-12-31 12:00' date -d '1 day ago'. Recibe un error porque no había 2011-12-30 allí. Es decir, el desplazamiento del día se realizó en la hora del calendario. 31/12/2011 menos 31 días le da 30/11/2011 porque le quita 31 de 31. No le quita 31 * 24 * 60 * 60 * 60 segundos de la hora actual. Compare con lo TZ=Pacific/Apia faketime '2011-12-31 12:00' date -d '24 hour ago'que le da el 29, es decir, esta vez, la fecha en que fue hace 24 * 60 * 60 * 60 segundos.
Aquí hay una versión que funciona en Mac OS, que utiliza la dateutilidad BSD :
date -v1d -v-1d +%d%b%Y
Los argumentos se aplican en orden. Puede imaginarse que una fecha se canaliza de un argumento a otro. Por ejemplo:
date) -> 2017-03-06-v1d) -> 2017-03-01-v-1d)-> 2017-02-28+%d%b%YDar formato a la fecha ( ) -> 28 de febrero de 2017Puede alcanzar cualquier cantidad de meses hacia adelante o hacia atrás usando date -v-1m -v1d -v-1d, reemplazando -1mcon la cantidad de meses hacia atrás o hacia adelante ( +1m) que desee.
Esa es la respuesta genérica. Esta pregunta específicamente pregunta sobre fechas relativas a una fecha de inicio. La utilidad de fecha Mac OS / BSD no le permite proporcionar un sello de fecha para comenzar, pero puede configurar cada elemento de fecha individualmente:
date -v2015y -v1m -v15d -v1d -v-1d +%d%b%Y -> 31dic.2014
Intenta usar este código
date -d "-$(date +%d) days month" +%Y-%m-%d