Problems with mktime

P

Paul N

I'm trying to write a program that will show the time at various
different places. The idea is to get the GMT time, adjust it for the
correct time zone offset (including DST if appropriate) and display
it. My first attempt (limited to BST) would use gmtime to get GMT, add
1 to the tm_hour member, knock off 24 if the adjusted hour exceeded
23, and show it. This worked OK. However, I discovered the function
mktime which I though might provide a more general solution. As I
understand it, if you pass it a struct in which the number of the hour
is outside the proper range, it will adjust things so that it isn't.

Unfortunately it's not doing what I want. In the following code:

struct tm *t;
time_t lTime;

time(&lTime);
t = gmtime(&lTime);
mktime(t);

it is showing an hour ahead of GMT. Whereas if I comment out the
mktime line it shows GMT correctly. I've tried setting t -> tm_isdst =
0; between the gmtime and the mktime but this doesn't help. Why is
mktime changing the time it is passed in? (By the way, my actual time
zone is BST, ie currently one hour ahead of GMT.)

Am I using it wrong, or am I misunderstanding what it's meant to do?

Thanks for any help.
Paul.
 
R

Richard Kettlewell

Paul N said:
I'm trying to write a program that will show the time at various
different places. The idea is to get the GMT time, adjust it for the
correct time zone offset (including DST if appropriate) and display
it. My first attempt (limited to BST) would use gmtime to get GMT, add
1 to the tm_hour member, knock off 24 if the adjusted hour exceeded
23, and show it. This worked OK. However, I discovered the function
mktime which I though might provide a more general solution. As I
understand it, if you pass it a struct in which the number of the hour
is outside the proper range, it will adjust things so that it isn't.

Unfortunately it's not doing what I want. In the following code:

struct tm *t;
time_t lTime;

time(&lTime);
t = gmtime(&lTime);
mktime(t);

it is showing an hour ahead of GMT. Whereas if I comment out the
mktime line it shows GMT correctly. I've tried setting t -> tm_isdst =
0; between the gmtime and the mktime but this doesn't help. Why is
mktime changing the time it is passed in? (By the way, my actual time
zone is BST, ie currently one hour ahead of GMT.)

Am I using it wrong, or am I misunderstanding what it's meant to do?

mktime() expects local time - i.e. BST in your case. The UTC equivalent
is timegm(), but it isn't implemented everywhere.
 
K

Keith Thompson

Paul N said:
I'm trying to write a program that will show the time at various
different places. The idea is to get the GMT time, adjust it for the
correct time zone offset (including DST if appropriate) and display
it. My first attempt (limited to BST) would use gmtime to get GMT, add
1 to the tm_hour member, knock off 24 if the adjusted hour exceeded
23, and show it. This worked OK. However, I discovered the function
mktime which I though might provide a more general solution. As I
understand it, if you pass it a struct in which the number of the hour
is outside the proper range, it will adjust things so that it isn't.

Unfortunately it's not doing what I want. In the following code:

struct tm *t;
time_t lTime;

time(&lTime);
t = gmtime(&lTime);
mktime(t);

it is showing an hour ahead of GMT. Whereas if I comment out the
mktime line it shows GMT correctly. I've tried setting t -> tm_isdst =
0; between the gmtime and the mktime but this doesn't help. Why is
mktime changing the time it is passed in? (By the way, my actual time
zone is BST, ie currently one hour ahead of GMT.)

Am I using it wrong, or am I misunderstanding what it's meant to do?

Quoting the standard's description of mktime() (C99 7.23.2.3p2)
(emphasis added):

The mktime function converts the broken-down time, *expressed
as local time*, in the structure pointed to by timeptr into
a calendar time value with the same encoding as that of the
values returned by the time function.

Unfortunately, there's no corresponding function that converts a
broken-down time expressed in GMT/UTC.
 
P

Paul N

Quoting the standard's description of mktime() (C99 7.23.2.3p2)
(emphasis added):

    The mktime function converts the broken-down time, *expressed
    as local time*, in the structure pointed to by timeptr into
    a calendar time value with the same encoding as that of the
    values returned by the time function.

Unfortunately, there's no corresponding function that converts a
broken-down time expressed in GMT/UTC.

Thanks to you both. I'm still a bit puzzled as to what's going on -
calling mktime twice only adjusts the hour once, it must somehow know
it's already done it and I don't see how - but I think the best
solution is probably for me to leave it well alone!

Paul.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top