[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.c

Problems with mktime

gw7rib

4/4/2011 6:59:00 PM

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

Richard Kettlewell

4/4/2011 7:26:00 PM

0

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

Keith Thompson

4/4/2011 7:32:00 PM

0

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.ne...
Nokia
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"

gw7rib

4/5/2011 9:32:00 PM

0

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.

gordonb.avg87

4/5/2011 11:29:00 PM

0

Which BST are you in? There is, at least, Brazil Standard Time and
Bering Summer Time.

gmtime() always fills in a struct tm with tm_isdst = 0.

mktime() will see that the current date is one where daylight savings
time should be in effect, so it adjusts the time and sets tm_isdst = 1.
(At other times of the year, there would be no adjustment).
On subsequent calls, no adjustment is needed.