‘localtime()’ loves ‘05:30:00’¶
Updated: May 07, 2024
Got some problem when I’m converting elapsed time time_t
to struct tm
for printing time in %H:%M:%S
format. Here is the code,
/* code to learn how 'localtime()' works */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char **argv)
{
struct tm time1;
struct tm *time2;
time_t time;
char timestring[20];
time2 = (struct tm *)malloc(sizeof(struct tm));
/* setting 0 seconds to time */
time = (time_t) 0;
localtime_r(&time, &time1);
time1.tm_hour = time1.tm_hour - 5;
time1.tm_min = time1.tm_min - 30;
strftime(timestring,
20,
"%H:%M:%S",
&time1);
printf("Time1: %s\n",
timestring);
/* setting 1 minute 10 seconds to time */
time = (time_t) 70;
time2 = localtime(&time);
time2->tm_hour = time2->tm_hour - 5;
time2->tm_min = time2->tm_min - 30;
strftime(timestring,
20,
"%H:%M:%S",
time2);
printf("Time2: %s\n",
timestring);
free(time2);
return(0);
}
And the output is,
Time1: 05:30:00
Time2: 05:31:10
I don’t know why its happening, localtime()
creates struct tm
structure which by default have 05:30:00 as its starting time. I need to manually subtract the 5 from tm_hour and 3 from tm_min to get what I want.
time1.tm_hour = time1.tm_hour - 5;
time1.tm_min = time1.tm_min - 30;
time2->tm_hour = time2->tm_hour - 5;
time2->tm_min = time2->tm_min - 30;
Here is the updated output,
Time1: 00:00:00
Time2: 00:01:10
Also localtime()
sets default values to all the variables in the result struct tm
structure. google not helping to find the reason.