如何在Solaris上的C++中知道GMT和本地时间的差异?

hs1ihplo  于 2023-04-08  发布在  其他
关注(0)|答案(2)|浏览(116)

我喜欢用秒数来计算本地时间(在某些时区)和GMT的差异。我使用以下代码片段:

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;

但是,我得到了一个错误的差异。我在这里做的是通过time(0)查询当前时间作为GMT。然后假设这是本地时间,我调用gmtime添加GMT差异因子并使用mktime重新转换为本地时间。这应该显示GMT和我的时区的差异,但它显示了1小时的额外差异(夏令时)。
例如,我的当前时间是Thu Mar 13 04:54:45 EDT 2014当我获得GMT的当前时间时,应该是:考虑到这是当前时间,如果我调用gmtime,这应该进一步进行,并重新转换回来应该给予我一个4小时的差异,但我得到一个5小时的差异。
gmtime在这里使用错误吗?还有,我怎么知道当前时区以及夏令时的时间?

0vvn1miw

0vvn1miw1#

好了!
下面的代码片段可以解决这个问题:

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;
}

诀窍是检查tm_isdst标志,如果适用,如果设置,调整一个小时以上的差异这工程.感谢大家的时间.

rn0zuynd

rn0zuynd2#

这可以用我认为正确的方式来处理:

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)

相关问题