문제

I like to calculate the difference of local time (in some timezone) and GMT in terms of number of seconds. I use the following code snippet:

time_t now = time(0); // GMT
time_t gmnow = mktime(gmtime(&now)); // further convert to GMT presuming now in local
time_t diff = gmnow - now;

But, I am getting a wrong difference. What I am doing here is querying the current time as GMT through time(0). Then presuming that is a local time, I call gmtime to add the GMT difference factor and re-convert to local time using mktime. This should have shown the difference of GMT and my timezone, but it is showing a extra difference of 1 hour (daylight savings).

For example, my current time is Thu Mar 13 04:54:45 EDT 2014 When I get current time as GMT, that should be: Thu Mar 13 08:55:34 GMT 2014 Considering this is current time, if I call gmtime, this should further proceed, and re-converting back should give me a difference of 4 hr, but I am getting a difference of 5hr.

Is gmtime usage wrong here? Also, how do I know current time zone as well as time in daylight savings?

도움이 되었습니까?

해결책

Got it!

The following code snippet would solve this:

time_t now = time(0); // UTC
time_t diff;
struct tm *ptmgm = gmtime(&now); // further convert to GMT presuming now in local
time_t gmnow = mktime(ptmgm);
diff = gmnow - now;
if (ptmgm->tm_isdst > 0) {
    diff = diff - 60 * 60;
} 

The trick is to check tm_isdst flag, if applicable and if set, adjust one hour more to diff This works. Thanks to all for your time.

다른 팁

This can handle it in the correct way I think:

time_t t = time (NULL);
tm * srTM = localtime(&t);
setenv("TZ", "GMT0",1); //Change your timezone to GMT
time_t t2 = mktime(srTM);  
diff = difftime(t2,t);
setenv("TZ", "CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00", 1); //Reset your timezone to correct one (here CET)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top