[C con Clase] Actualizacion de Fecha

Salvador Pozo salvador en conclase.net
Mie Nov 23 10:45:44 CET 2011


El pasado 2011-11-22 20:28:51, Edinson escribió:
 
Hola:

Personalmente, me resulta muy incómodo trabajar con fechas, hay demasiadas irregularidades y excepciones para que el código quede claro, corto, y fácil de comprender.

Según he entendido, lo que quieres conseguir es que a partir de una fecha cualquiera, el programa calcule la fecha más cercana anterior con el mismo día del mes.

Antes de empezar, se me ocurren algunas excepciones para las que tendrás que definir un comportamiento. 

Por ejemplo, considerando que la fecha actual fuese el 15 de Marzo de 2011, y la fecha a modificar el 30 de Diciembre de 2010.

Según entendí, al nueva fecha sería 2011/02/30, que evidentemente, es una fecha inválida (febrero, en 2011, sólo tiene 28 días). En ese caso, y en varios otros similares, hay que decidir si tomamos el último día del mes (2011/02/28) o el teórico correspondiente del mes siguiente, como han pasado dos días desde el último de Febrero, en este caso, sería el 2011/03/02.

Dejaré esos detalles a tu criterio.

Una primera aproximación puede ser esta:
----8<------
#include <iostream>
#include <ctime>

using namespace std;

int main()
{
    time_t fecha1, hoy;
    tm separado;

    separado.tm_sec = separado.tm_min = separado.tm_hour = 0;
    separado.tm_year = 2011-1900;
    separado.tm_mon = 10; // Noviembre
    separado.tm_mday = 23;

    hoy = mktime(&separado);

    separado.tm_sec = separado.tm_min = separado.tm_hour = 0;
    separado.tm_year = 2009-1900;
    separado.tm_mon = 5; // Junio
    separado.tm_mday = 18;

    fecha1 = mktime(&separado);

    // Ajustar el año:
    while(fecha1 < hoy) {
        separado.tm_year++;
        fecha1 = mktime(&separado);
    }

    separado.tm_year--;
    fecha1 = mktime(&separado);
    // Ajustar el mes:
    while(fecha1 < hoy) {
        separado.tm_mon++;
        fecha1 = mktime(&separado);
    }
    separado.tm_mon--;

    cout << separado.tm_year+1900 << "/" << separado.tm_mon+1 << "/" << separado.tm_mday << endl;
    return 0;
}
----8<------

Funciona bien siempre que el día de la fecha a ajustar exista en todos los meses. Para ver lo que digo, prueba a cambiar el día de 18 a 31.

Evidentemente, para tu problema concreto, tendrás que hacer algunos ajustes...

Supongo que existen formas más eficaces de resolver el problema, sin pasar por todos los años y meses... Esto es lo primero que se me ha ocurrido.

Suerte, y hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


Más información sobre la lista de distribución Cconclase