Para Excel, el número 1 es el 1 de enero de 1900, el 2 es el 2 de enero de 1900 y así sucesivamente.
Hoy 11 de junio de 2009 es el número 39975.
Ya he creado la macro que me pasa una fecha a número. Es la siguiente:
Código c++:
Ver original
#define FechaExcel(anno,mes,dia,hora,minuto) (((anno)-1900)*365.25+((anno)%4==0?0:1)+int((mes)*30.5)-30+((mes)>2?((anno)%4==0?-1:-2):0)+(((mes)-9)*((mes)-11)==0 ?1:0)+float(dia)+float(hora)/24.+float(minuto)/1440.)
Para pasar del número a la fecha he creado un macro y dos funciones, que describo abajo. Mi pregunta es si alguien sabe si este trabajo ya está hecho y si no, si es correcto lo que he escrito y si es posible simplificarlo:
Código c++:
Ver original
#define ano(fecha) int(1900+(fecha-1)/365.25)
Código c++:
Ver original
int mes(int fecha){ // devuelve el mes correspondiente a esta fecha // primero recalcula la fecha quitándole la cantidad correspondiente a los cuatrienios int nfecha = fecha-int((fecha-1)/1461)*1461; // si está en el cuarto año del cuatrienio if(nfecha > 1461-365) nfecha-=(1461-365); // si está en el tercer año else if(nfecha > 1461-365-365) nfecha-=(1461-365-365); // si está en el segundo año else if(nfecha > 1461-365-365-365) nfecha-=(1461-365-365-365); int dmes[]={0.,31.,28.,31.,30.,31.,30.,31.,31.,30.,31.,30.,31.}; bool bisiesto = (int(4*(fecha-1)/1461)%4 == 0); if(bisiesto) dmes[2] = 29.; for(int i=1;i<13;i++){ dmes[i] += dmes[i-1]; if(dmes[i] >= nfecha) return(i); } MessageBox(0,"error en el mes","error",0); return(0); }
Código c++:
Ver original
int dia(int fecha){ // devuelve el dia correspondiente a esta fecha // primero recalcula la fecha quitándole la cantidad correspondiente a los cuatrienios int nfecha = fecha-int((fecha-1)/1461)*1461; // si está en el cuarto año del cuatrienio if(nfecha > 1461-365) nfecha-=(1461-365); // si está en el tercer año else if(nfecha > 1461-365-365) nfecha-=(1461-365-365); // si está en el segundo año else if(nfecha > 1461-365-365-365) nfecha-=(1461-365-365-365); float dmes[]={0.,31.,28.,31.,30.,31.,30.,31.,31.,30.,31.,30.,31.}; bool bisiesto = (int(4*(fecha-1)/1461)%4 == 0); if(bisiesto) dmes[2] = 29.; for(int i=1;i<13;i++){ dmes[i] += dmes[i-1]; if(dmes[i] >= nfecha) return(nfecha - dmes[i-1]); } MessageBox(0,"error en el día","error",0); return(0); }