# How do I subtract time?

I inputted some data from a text file such that nHour and nMinute is filled with an integer representing some hour and minute.

The time is represented using the 12h, not 24h, format.  So 1:30pm is reflected by nHour = 1, and nMinute = 30, and there is a string strAMPM containing "AM" or "PM".

My question is I want to calculate how many minutes has elapsed since X, where X is a time in the past BEFORE nHour/nMinute has occurred, but within the same day.

So let's say nHour = 1, and nMinute = 30, and X = 9:00am.  X may be whatever data type you need it to be but it has to represent some time value that I can modify/change in the future.

The answer to how much time has elapsed should be 270 (representing the 270 minutes difference between 9:00am and 1:30pm.  How do I do this?

I can already envision the pseudo-code of how this would work, but I do not know the C++ functions that I would need to use and how to implement them.  Thus, actual code that I can follow would be much appreciated.
LVL 1
###### Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Commented:
The easiest would probably be to calculate the number of minutes since the beginning of the day (for both times), and then subtract those two values to get the difference in minutes.

Calculating the number of minutes is easy : (hour * 60) + min, and if it's "PM", just add (12 * 60).
0
Commented:
Use 'mktime()' (http://www.cplusplus.com/reference/clibrary/ctime/mktime/) to create a 'time_t' value for both times, (which is 'The time function returns the number of seconds elapsed since midnight (00:00:00), January 1, 1970') - you then can subtract these values and use 'gmtime()' (http://www.cplusplus.com/reference/clibrary/ctime/gmtime/) to obtain the amount of hours, minutes etc.
0
Author Commented:
ok i'm interested in learning a new function, the mktime()...i looked at the example but it doesn't show how to create a 'time_t' value from the hour and minute variables that i have, nHour and nMinute...

it only shows year, month, and day.  how would i convert nHour and nMinute into a time_t value?
0
Commented:
You can do that like
``````time_t t1;
time_t t2;
struct tm tm1;
struct tm tm2;

memset(&tm1,0,sizeof(struct tm));
memset(&tm2,0,sizeof(struct tm));

tm1.tm_sec = 0; //Seconds after minute (0 – 59)
tm1.tm_min = 30; //Minutes after hour (0 – 59)
tm1.tm_hour = 12; //Hours since midnight (0 – 23)
tm1.tm_mday = 1; //Day of month (1 – 31)
tm1.tm_mon = 12; // Month (0 – 11; January = 0)
tm1.tm_year = 104;//Year (current year minus 1900)

tm2.tm_sec = 0; //Seconds after minute (0 – 59)
tm2.tm_min = 30; //Minutes after hour (0 – 59)
tm2.tm_hour = 12; //Hours since midnight (0 – 23)
tm2.tm_mday = 1; //Day of month (1 – 31)
tm2.tm_mon = 7; // Month (0 – 11; January = 0)
tm2.tm_year = 102;//Year (current year minus 1900)

t1 = mktime(&tm1);
t2 = mktime(&tm2);

double secs = difftime(t1,t2); // get difference in seconds - divide by 60 to get the minutes
``````
0

Experts Exchange Solution brought to you by

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Author Commented:
ok, can you explain to me what this line does? and why we need it?

memset(&tm1,0,sizeof(struct tm));
0
Author Commented:
also, why are we declaring structs here?

struct tm tm1;

i'm confused as to syntax...usually i declare a struct like this..

struct tm
{
//stuff inside
}

what does struct tm tm1;  do?
0
Commented:
'struct tm' is a C construct and in C it's perfectly legal to use them like that (hence, in C++ also). 'struct tm tm1;' does not declare a struct, it just instantiates 't1'.
0
Author Commented:
ok, thanks for explaining...how about my other question before that (see earlier post)?

ok, can you explain to me what this line does? and why we need it?

memset(&tm1,0,sizeof(struct tm));
0
Commented:
Well, it is easier zo zero-out a struct in one call rather than setting each member to '0' manually, that's all.
0
Author Commented:
ok thanks!
0
###### It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Editors IDEs

From novice to tech pro — start learning today.