Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   Problems with mktime (http://www.velocityreviews.com/forums/t746331-problems-with-mktime.html)

Paul N 04-04-2011 06:58 PM

Problems with mktime
 
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.

Richard Kettlewell 04-04-2011 07:25 PM

Re: Problems with mktime
 
Paul N <gw7rib@aol.com> writes:

> 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.

--
http://www.greenend.org.uk/rjk/

Keith Thompson 04-04-2011 07:31 PM

Re: Problems with mktime
 
Paul N <gw7rib@aol.com> writes:
> 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.

--
Keith Thompson (The_Other_Keith) kst-u@mib.org <http://www.ghoti.net/~kst>
Nokia
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"

Paul N 04-05-2011 09:31 PM

Re: Problems with mktime
 
On Apr 4, 8:31*pm, Keith Thompson <ks...@mib.org> wrote:
> Paul N <gw7...@aol.com> writes:
> > 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.


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.


All times are GMT. The time now is 04:55 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.