linux - fecha - Usando el comando `date` para obtener el mes anterior, actual y siguiente
date dia anterior linux (3)
Estoy usando debajo para obtener el anterior, el actual y el mes siguiente en Ubuntu
11.04:
LAST_MONTH=`date +''%m'' -d ''last month''`
NEXT_MONTH=`date +''%m'' -d ''next month''`
THIS_MONTH=`date +''%m'' -d ''now''`
Funciona bien hasta hoy, el último día de octubre de 2012 (2012-10-31)
Obtengo el resultado por debajo de ahora:
$ date
Wed Oct 31 15:35:26 PDT 2012
$ date +''%m'' -d ''last month''
10
$ date +''%m'' -d ''now''
10
$ $ date +''%m'' -d ''next month''
12
Supongo que las salidas deberían ser 9
, 10
, 11
respectivamente.
No entiendo por qué las salidas de date
comportan así. ¿Cuál debería ser una buena manera de obtener el previous
, el current
y el mes next
?
El problema es que la date
toma su solicitud literalmente y trata de usar una fecha del 31 de septiembre (siendo el 31 de octubre menos un mes) y luego porque eso no existe pasa al día siguiente, lo cual sucede. La documentación de date
(a partir de la info date
) tiene los siguientes consejos:
La fuzz en las unidades puede causar problemas con los elementos relativos. Por ejemplo, `2003-07-31 -1 month ''podría evaluar a 2003-07-01, porque 2003-06-31 es una fecha no válida. Para determinar el mes anterior de manera más confiable, puede solicitar el mes anterior al día 15 del mes actual. Por ejemplo:
$ date -R Thu, 31 Jul 2003 13:02:39 -0700 $ date --date=''-1 month'' +''Last month was %B?'' Last month was July? $ date --date="$(date +%Y-%m-15) -1 month" +''Last month was %B!'' Last month was June!
el problema principal ocurre cuando no tiene la fecha - opción de fecha disponible y no tiene permiso para instalarlo, intente a continuación -
Previous month
#cal -3|awk ''NR==1{print toupper(substr($1,1,3))"-"$2}''
DEC-2016
Current month
#cal -3|awk ''NR==1{print toupper(substr($3,1,3))"-"$4}''
JAN-2017
Next month
#cal -3|awk ''NR==1{print toupper(substr($5,1,3))"-"$6}''
FEB-2017
Si usa la fecha en un entorno MacOS, intente esto:
ST1:~ ejf$ date
Mon Feb 20 21:55:48 CST 2017
ST1:~ ejf$ date -v-1m +%m
01
ST1:~ ejf$ date -v+1m +%m
03
Además, prefiero calcular el mes anterior y el siguiente el primer día de cada mes, de esta manera no tendrá problemas con los meses que terminan el 30/31 o 28/29 (año bisiesto de febrero / febrero)