gw7rib
4/5/2011 9:32:00 PM
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.