Saltar al contenido

Herramienta en UNIX para restar fechas

Hemos estado buscado en distintos sitios para tenerte la solución para tu problema, si tienes alguna difcultad déjanos tu inquietud y contestamos porque estamos para servirte.

Solución:

Desafortunadamente, ninguna de las utilidades de línea de comandos POSIX proporciona aritmética en las fechas. date -d y date +%s son el camino a seguir si los tiene, pero son extensiones GNU.

Hay un truco torpe con touch ese tipo de trabajos para verificar que una fecha es al menos n días en el pasado:

touch -t 201009090000 stamp
if [ -n "$(find stamp -mtime +42)" ]; then ...

(Tenga en cuenta que este código puede estar desactivado por uno si el horario de verano comenzó o se detuvo en el intervalo y el script se ejecuta antes de la 1 am).

Varias personas terminaron implementando bibliotecas de manipulación de fechas en Bourne o POSIX Shell. Hay algunos ejemplos y enlaces en las preguntas frecuentes de comp.unix.shell.

Instalar herramientas GNU puede ser la forma menos dolorosa.

intentaría usar el date comando que es parte de POSIX, por lo que está en casi todas partes. ACTUALIZACIÓN: Desafortunadamente, parece que -d no es parte de la fecha POSIX y probablemente no esté en Solaris. Por lo tanto, es probable que esto no responda la pregunta de los OP.

d1=`date -d 20100909 +%s`
d2=`date -d 20001010 +%s`

Ahora d1 y d2 son números enteros que corresponden a segundos desde la época de Unix. Por lo tanto, para obtener la diferencia entre los dos, restamos ( $((d1-d2)) en bash) y encubierto a las unidades que queramos. Los días son los más fáciles:

echo "$(((d1-d2)/86400)) days"

Es probable que la forma de realizar la conversión sea diferente si no tiene bash. La forma más portátil puede ser usar expr (página man posix de expr).

Aquí hay un script awk que acabo de escribir, debería funcionar con un POSIX awk. Tendrás que probar la versión de Solaris; recuerde que también hay dos versiones de Awk en Solaris, una en /bin y otra en /usr/xpg4/bin/awk (que es nawk, creo).

BEGIN 
    daysofmonth["01"] = 0; daysofmonth["02"] = 31; daysofmonth["03"] = 59;
    daysofmonth["04"] = 90; daysofmonth["05"] = 120; daysofmonth["06"] = 151;
    daysofmonth["07"] = 181; daysofmonth["08"] = 212; daysofmonth["09"] = 243;
    daysofmonth["10"] = 273; daysofmonth["11"] = 304; daysofmonth["12"] = 334;
    fullday = 86400;

/[12][09][0-9][0-9][01][0-9][0123][0-9]/ 
    year = substr($0, 1, 4); month = substr($0, 5, 2); day = substr($0, 7, 2);
    date = ((year - 1970) * 365.25) + daysofmonth[month] + day - 1;
    if ((year % 4) == 0 && month > 2)  date = date + 1; 
    print date * fullday - (25200);


Pasar una fecha AAAAmmdd string a través y se convertirá en número de segundos desde la época (con un poco de concesión por estar en los límites del día). Entonces podrás restar los dos.

today=`echo 20110210 | awk -f convdate.awk`
then=`echo 20001231 | awk -f convdate.awk`
sincethen=`expr $today - $then`

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *