Pregunta: | 46038 - COMO SUMAR UN MES A UNA FECHA |
Autor: | daniel trejo |
tengo que hacer un programa en visual c++ que genere flujos de tasas y para eso necesito que sume un periodo de tiempo determinado a una fecha, por ejemplo 3 meses, traté de ver si las funciones de ctime o ctimespan me podrian ayudar pero lo maximo que llegan es a dias, y no es lo mismo sumarle a una fecha 30 dias que 1 mes. por lo tanto debo de programar mi propia clase o ya existe una clase que lo haga (por ejemplo la funcion dateadd() de visual basic)? de antemano muchas gracias |
Respuesta: | Héctor Murcia |
/* date.h */ #include <cstdlib> class Date { int dia, mes, anio; public: Date() {}; Date(int, int, int); Date add_to_date(Date, char, int); void print(); }; /* Un año es bisiesto si es divisible entre 4, a menos que sea divisible entre 100. Sin embargo, si un año es divisible entre 100 y además es divisible entre 400, también resulta bisiesto. Obviamente, esto elimina los años finiseculares (últimos de cada siglo, que ha de terminar en 00) cuyo siglo no es múltiplo de 4. */ int bisiesto(int year) { return year % 4 == 0 && year % 100 != 0 || year % 400 == 0; // return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0); } Date::Date(int d, int m, int y) { dia = d; mes = m; anio = y; } Date Date::add_to_date(Date date, char um, int hm) { int dias[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; Date dr = date; switch(tolower(um)) { case 'y': dr.anio += hm; break; case 'm': dr.mes += hm; dr.anio += dr.mes / 12; dr.mes = dr.mes % 12; break; case 'd': dr.dia += hm; break; default: dr.dia += hm; } dias[1] = (bisiesto(dr.anio) ? 29 : 28); // Febrero tiene 29 dias cuando año es bisiesto. while (dr.dia > dias[dr.mes - 1]) { std::cout << '+'; dr.dia -= dias[dr.mes - 1]; dr.mes++; if (dr.mes > 12) { dr.mes = 1; dr.anio++; dias[1] = (bisiesto(dr.anio) ? 29 : 28); // Febrero tiene 29 dias cuando año es bisiesto. } } if (abs(dr.mes) > 12) { dr.anio += dr.mes / 12; dr.mes = dr.mes % 12; } return dr; } void Date::print() { std::cout << dia << '/' << mes << '/' << anio; } /* D E M O */ #include <iostream> #include "date.h" using namespace std; int main() { Date myb(28, 3, 1962), today; today = myb.add_to_date(myb, 'd', 366); today.print(); } |