Calculate the difference between two struct tm values
tm event_date_time;
timeval curTime;
time_t time_now;
time_t time_event;
//Note time_t is num of seconds since 1970 so your tm_year must be >= 1970 or you'll get a -1 value from time_t!!
gettimeofday(&curTime, NULL); //Get the RPi's current time
event_date_time.tm_year = 20;
event_date_time.tm_mon = 1;
event_date_time.tm_mday = 1;
event_date_time.tm_hour = 1;
event_date_time.tm_min = 1;
event_date_time.tm_sec = 1;
time_now = mktime(localtime(&curTime.tv_sec)); //Convert tm to time_t
time_event = mktime(&event_date_time); //Convert tm to time_t
int difference = (int)difftime(time_now, time_event); //Get the difference in seconds (If positive, then time_now > time_event)
Adjusting tm values (add/subtract secs, mins, days, etc)
tm1.tm_mday += 7;
mktime(&tm1); //A call to this mktime() automatically adjusts the values of the members of timeptr it is called with if they are off-range (except tm_wday and tm_yday)
Adjusting the struct tm values won’t cause roll overs (e.g. if you -100 from .tm_second you will get a negative .tm_second value), you get left with the values adjusted but a potentially out of range value. mktime() is used to convert but it will correct the tm poitner it is called with so the vcalues are in range, so we don’t bother getting its result and instead use this handy side effect of calling it.
Add Or Subtract Days To A Date
This uses the answer suggested by @tenfour here.
NOT SURE ABOUT THIS SOLUTIONS USE OF LOCALTIME–_NEEDS CONFIRMING IS GOOD??
//******************************************************
//******************************************************
//********** ADD OR SUBTRACT DAYS FROM A DATE **********
//******************************************************
//******************************************************
void add_subtract_days_from_date(struct tm *date, int days_to_add_or_subtract)
{
const time_t ONE_DAY = 24 * 60 * 60 ;
time_t date_seconds = mktime(date) + (days * ONE_DAY) ; //Seconds since start of epoch
*date = *localtime(&date_seconds); //Use localtime because mktime converts to UTC so may change date
}