Problem
You want to know the amount of time elapsed between two date/time points.
Solution
If both date/time points falls between the years of 1970 and 2038, you can use a time_t type and the difftime function from the header. Example 5-6 shows how to compute the number of days elapsed between two dates.
Example 5-6. Date and time arithmetic with time_t
#include #include #include using namespace std; time_t dateToTimeT(int month, int day, int year) { // january 5, 2000 is passed as (1, 5, 2000) tm tmp = tm( ); tmp.tm_mday = day; tmp.tm_mon = month - 1; tmp.tm_year = year - 1900; return mktime(&tmp); } time_t badTime( ) { return time_t(-1); } time_t now( ) { return time(0); } int main( ) { time_t date1 = dateToTimeT(1,1,2000); time_t date2 = dateToTimeT(1,1,2001); if ((date1 == badTime( )) || (date2 == badTime( ))) { cerr << "unable to create a time_t struct" << endl; return EXIT_FAILURE; } double sec = difftime(date2, date1); long days = static_cast(sec / (60 * 60 * 24)); cout << "the number of days between Jan 1, 2000, and Jan 1, 2001, is "; cout << days << endl; return EXIT_SUCCESS; }
The program in Example 5-6 should output :
the number of days between Jan 1, 2000, and Jan 1, 2001, is 366
Notice that the year 2000 is a leap year because even though it is divisible by 100; it is also divisible by 400, thus it has 366 days.
Discussion
The time_t type is an implementation defined arithmetic type. This means it is either an integer or floating-point type, and thus supports the basic arithmetic operations. You can add, subtract, divide, multiply, and so forth. To compute the distance between two time_t values to seconds, you need to use the difftime function. Do not assume that time_t itself counts seconds, even if it is true. Many C++ implementations may very well quietly change it to count fractions of a second in the near future (this is one reason why difftime returns a double).
If the limitations of time_t are too restricting then you will probably want instead to use the various classes from the Boost date_time library to compute time intervals. Example 5-7 shows how to use the Boost classes to calculate the number of days in the 20th and the 21st centuries.
Example 5-7. Date and time arithmetic with date_duration
#include #include using namespace std; using namespace boost::gregorian; int main( ) { date_duration dd = date(2000, 1, 1) - date(1900, 1, 1); cout << "The twentieth century had " << dd.days( ) << " days" << endl; dd = date(2100, 1, 1) - date(2000, 1, 1); cout << "The twenty-first century will have " << dd.days( ) << " days" << endl; }
The program in Example 5-7 outputs:
The twentieth century had 36524 days The twenty-first century will have 36525 days
Building C++ Applications
Code Organization
Numbers
Strings and Text
Dates and Times
Managing Data with Containers
Algorithms
Classes
Exceptions and Safety
Streams and Files
Science and Mathematics
Multithreading
Internationalization
XML
Miscellaneous
Index