A good way of storing and working with dates and time in C++. A structure containing a calendar date and time broken down into its components.
Creating a tm
#include <ctime>
tm my_date_time;
my_date_time.tm_year = (2015 - 1900); //years since 1900 (we must be >= 1970 for time_t based calcs)
my_date_time.tm_mon = 1; //months since January (0-11)
my_date_time.tm_mday = 18;
my_date_time.tm_hour = 12;
my_date_time.tm_min = 03;
my_date_time.tm_sec = 48;
Note:
tm_year is years since 1900!!
tm_month is months since January (0-11)!!
Note when converting to time_t your year must be >= 1970 as time_t is usually based from 00:00, Jan 1 1970 UTC!
Loading with current time
#include <time.h>
#include <sys/time.h>
timeval curTime;
tm *my_date_time;
gettimeofday(&curTime, NULL);
my_date_time = localtime(&curTime.tv_sec);
= my_date_time->tm_year - 100;
= my_date_time->tm_mon + 1;
= my_date_time->tm_mday;
= my_date_time->tm_hour;
= my_date_time->tm_min;
= my_date_time->tm_sec;
Converting tm to Universal Time String
char my_date_time_string[22];
strftime(my_date_time_string, sizeof(my_date_time_string), "%Y-%m-%dT%H:%M:%S", &my_date_time);
Convert tm to StringStream
//Create as yyyymmddhh
stringstream ss_archive_file_timestamp;
ss_archive_file_timestamp << (tmFromDate.tm_year + 1900); //2000 - 2099
ss_archive_file_timestamp << setfill('0') << setw(2) << (tmFromDate.tm_mon + 1); //1-12
ss_archive_file_timestamp << setfill('0') << setw(2) << tmFromDate.tm_mday; //1-31
ss_archive_file_timestamp << setfill('0') << setw(2) << tmFromDate.tm_hour; //0-23
//Create in UTC format
stringstream ss_archive_file_timestamp_utc;
ss_archive_file_timestamp_utc << (tmFromDate.tm_year + 1900) << "-"; //2000 - 2099
ss_archive_file_timestamp_utc << setfill('0') << setw(2) << (tmFromDate.tm_mon + 1) << "-"; //1-12
ss_archive_file_timestamp_utc << setfill('0') << setw(2) << tmFromDate.tm_mday << " "; //1-31
ss_archive_file_timestamp_utc << setfill('0') << setw(2) << tmFromDate.tm_hour << ":00:00"; //0-23
Convert String To DateTime
std::tm tm1 = {};
if (strptime(MyDateCharString, "%Y-%m-%d", &tm1) == NULL) //Can include time characters too if wanted "%Y-%m-%d %H:%M:%S"
{
//Failed
}
Compare tm’s
if (mktime(&tm1) > mktime(&tm2)) //Larger values of mktime() are more recent in time
{
}
Add, Subtract with tm’s
https://raspberry-projects.com/pi/programming-in-c/datetime/datetime-calculations
