UnDomain Un friki suelto por la red

Calcular dia anterior en Unix


Hoy me he encontrado un pequeño problema: quiero ejecutar un script en el cual necesito saber la fecha de ayer. PERO el sistema operativo es HP-UX.

¿Que pasa con este SO (y la mayoría de Unix en general, excepto Linux)? Pues que el comando date no tiene la opción de calcular fechas pasada (ni futuras), con lo que resulta un poco complicado obtener el valor de una fecha pasada para usarlo como parámetro en cualquier programa.

Para poder conseguir esto he montado el siguiente script, que aviso que no soy precisamente un experto en shell script:

!/bin/sh
 

YEAR=`date "+%Y"`
MONTH=`date "+%m"`
DAY=`date "+%d"`
RESTA=1
 

DAY=$(($DAY+0))
MONTH=$(($MONTH+0))
 

if [ $# -gt 0 ] ; then
if [ $1 -gt 1 -a $1 -lt 9999 ] ; then
  RESTA=$1
fi
fi
 

c=1
while [ $c -le $RESTA ]
do
DAY=$(($DAY-1))
if [ $DAY = "0" ] ; then
  MONTH=$(($MONTH-1))
  DAY=28
  if ! [ $MONTH = "2" ]; then
    DAY=$(($DAY+2))
  fi
  if [ $MONTH = "1" -o $MONTH = "3" -o $MONTH = "5" -o $MONTH = "7" -o $MONTH = "8" -o $MONTH = "10" -o $MONTH = "12" ] ; then
      DAY=$(($DAY+1))
  fi
  if [ $MONTH = "2" ] ; then
    if [ `expr $YEAR % 4` = 0 -o `expr $YEAR % 400` = 0 ] ; then
      if ! [ `expr $YEAR % 400` = 0 ] ; then
        DAY=29
      fi
    fi
  fi
fi
 

if [ $MONTH = "0" ] ; then
  MONTH="12"
  YEAR=$(($YEAR-1))
fi
c=$(($c+1))
done
 

if [ $MONTH -lt 10 ] ; then
MONTH=0$MONTH
fi
 

if [ $DAY -lt 10 ] ; then
DAY=0$DAY
fi
 

echo $YEAR-$MONTH-$DAY

El código puede que no sea lo más óptimo, pero tiene en cuenta los años bisiestos y si le indicas un número como parámetros, resta esa cantidad de días a la fecha actual.
Lo he limitado a un máximo de 9999 días, pero es por poner algun límite.

El formato de salida es fijo a YYYY-MM-DD. Si alguien quiere otro formato de salida, solo tiene que modificar la última línea y poner lo que mas le interese.

Espero que sea de utilidad, y si alguien optimiza el código, pues se agradece ;)

Enviar un comentario nuevo

El contenido de este campo se mantiene privado y no se mostrará públicamente.
  • Las direcciones de las páginas web y las de correo se convierten en enlaces automáticamente.
  • Etiquetas HTML permitidas: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Saltos automáticos de líneas y de párrafos.

Mientras tanto, en "¿Alguien ha visto mi martillo?"...


Inicio de sesión


Todo el contenido mostrado ha sido obtenido libremente por la red. Las marcas indicadas son propiedad de sus legítimos dueños y se muestran a modo informativo de manera libre y voluntaria, sin intención publicitaria ni ánimo de lucro. Todo el material propio, y salvo que se indique lo contrario, se encuentra bajo licencia Creative Commons. Si tienes el Copyright de algún contenido o has detectado algna anomalia, por favor, infórmalo al correo undomain@gmail.com para ser corregido cuanto antes. El autor de esta Web no se hace responsable del contenido de terceras personas y de sites ajenos a este.

Powered by Drupal, an open source content management system