Obtenga el mes anterior independientemente de los días

4

En Linux, puedo obtener el mes pasado usando

date -d "last month" '+%Y%m'

o

date -d "1 month ago" '+%Y%m'

Pero digamos, hoy es 31 de marzo, si ejecuto el comando en la parte superior, muestra 201603, pero quiero obtener el mes pasado independientemente del día en que me encuentre ahora; ¿como lo puedo hacer?

Puedo lograrlo usando una solución alternativa como obtener el primer día / último día del mes anterior, pero me pregunto si hay alguna forma elegante de hacerlo.

 date -d "-$(date +%d) days" '+%Y%m'     #get last day of previous month
infierno
fuente
1
Relacionado: unix.stackexchange.com/q/134481/38906
cuonglm
Si esto es para el código de producción a escala, no olvide las falsedades que los programadores creen sobre el tiempo . Si es por tu guión personal, probablemente estés bien.
Comodín el

Respuestas:

9

La sabiduría habitual es usar el 15 de este mes. Luego reste 1 mes:

$ nowmonth=$(date +%Y-%m)
$ date -d "$nowmonth-15 last month" '+%Y%m'
201602

fuente
1

GNU dateno es particularmente adecuado para la aritmética como pretendes. Esa es una de las razones por las que escribí dateutils.

Su ejemplo se reduciría a:

$ dateadd today -1mo -f '%Y%m'
201603

Y hace lo correcto el 31 de marzo:

$ dateadd 2016-03-31 -1mo -f '%Y%m'
201602

O lo que quieres decir con tu comentario (obteniendo el último día del mes anterior) independientemente de la fecha de hoy:

$ dateround --next today -31d
2016-03-31
$ dateround --next 2016-03-31 -31d
2016-02-29
hroptatyr
fuente