Bien, aquí está el último fragmento de código que responde mi propia pregunta. Pensé en compartir esto en caso de que pueda ser útil para otras personas en el futuro. Gracias a Fred Larson por señalar el ejemplo de Boost.
Elegí Boost para hacer el cálculo DateTime porque mi aplicación ya hace uso de Boost en otro lugar. Creo que podría haber sido capaz de usar Qt también, aunque no puedo confirmarlo por completo.
Suponiendo DateTime se define como:
class DateTime
{
public:
int year;
int month;
int day;
int hour;
int min;
int sec;
int millisec;
};
Para hacer una simple comparación DateTime
bool DateTime::operator < (const DateTime& dt_)
{
using namespace boost::posix_time;
using namespace boost::gregorian;
ptime thisTime(date(this->year,this->month,this->day),
hours(this->hour) +
minutes(this->min) +
seconds(this->sec) +
boost::posix_time::millisec(int(this->millisec)));
ptime thatTime(date(dt_.year,dt_.month,dt_.day),
hours(dt_.hour) +
minutes(dt_.min) +
seconds(dt_.sec) +
boost::posix_time::millisec(int(dt_.millisec)));
return thisTime < thatTime;
}
Para añadir 2 DateTime juntos para devolver una nueva DateTime
DateTime DateTime::operator + (const DateTime& dt_)
{
using namespace boost::posix_time;
using namespace boost::gregorian;
date thisDate(this->year, this->month, this->day);
date newDate = thisDate + years(dt_.year) + months(dt_.month) + days(dt_.day);
ptime newDateTime(newDate,
hours(this->hour) + hours(dt_.hour) +
minutes(this->min) + minutes(dt_.min) +
seconds(this->sec) + seconds(dt_.sec) +
boost::posix_time::millisec(int(this->millisec)) +
boost::posix_time::millisec(int(dt_.millisec))
);
DateTime dateTime;
date t1_date = newDateTime.date();
dateTime.year = t1_date.year();
dateTime.month = t1_date.month();
dateTime.day = t1_date.day();
time_duration t1_time = newDateTime.time_of_day();
dateTime.hour = t1_time.hours();
dateTime.min = t1_time.minutes();
dateTime.sec = t1_time.seconds();
dateTime.millisec = t1_time.fractional_seconds()/1000.0f;
return dateTime;
}
Si tiene su propia clase ¿por qué necesita otra? –
O, lo que es más importante, si va a usar la clase de otra persona, ¿por qué usarlo solo para las comparaciones? Solo usa su clase. El trabajo está hecho para ti. Deshazte de tu clase. – GManNickG
La razón es porque mi aplicación es una biblioteca de C++ que otra aplicación utilizará. 1) No quiero que tengan que incluir bibliotecas de Boost para que hagan uso de mi biblioteca. 2) Esta clase DateTime ya se ha utilizado en muchos lugares de un sistema heredado. Gracias por los comentarios. – sivabudh