我喜欢用秒数来计算当地时间(在某些时区)和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;
但是,我得到了一个错误的区别。 我在这里做的是查询当前时间GMT到时间(0)。假设这是一个本地时间,我调用gmtime来添加GMT差异因子并使用mktime重新转换为本地时间。这应该显示GMT和我的时区的差异,但它显示1小时(夏令时)的额外差异。
例如,我现在的时间是2014年3月13日星期四04:54:45 当我获得GMT当前时间时,应该是: 2014年3月13日星期四08:55:34 GMT 考虑到这是当前时间,如果我打电话给gmtime,这应该继续进行,并且重新转换回来应该给我4小时的差异,但是我得到5小时的差异。
这里的gmtime使用错了吗? 另外,我如何知道当前时区以及夏令时?
答案 0 :(得分:0)
知道了!
以下代码段可解决此问题:
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标志,如果适用,如果设置,则再调整一小时到diff 这有效。 感谢您的所有时间。