我需要知道当前的UTC时间并将其转换为Unix时间戳。
我尝试使用time()
,mktime()
,gmtime()
的组合但未获得正确的UTC时间
以下是我正在使用的代码段:
time_t now;
struct tm ts;
char buf[80];
now = time(NULL);
ts = *gmtime(&now);
strftime(buf, sizeof(buf), "%a %Y-%m-%d %H:%M:%S %Z", &ts);
这给了我以下输出作为 - >时间::星期六2015-01-10 00:14:34 CST在当地时间增加5小时30分钟而不是减去5小时30分钟。 谁能告诉我为什么会这样?
答案 0 :(得分:2)
[edit]重新考虑了这个问题。
OP需要一个Unix time stamp。这样的时间戳是1970年1月1日以来的秒数。这可能只不过是下面的。sprintf(buffer, "%lld", (long long) time(NULL));
OTOH,OP似乎也想要年 - 月 - 小时:分:秒。这不是UNIX时间戳。这只是一个时间戳,本答案的其余部分讨论了一种可移植的方法。
time()
返回一些能够表示时间的真实类型。它通常是一些整数类型,表示自1970年1月1日0:00:00 UTC(或GMT)以来的秒数。
now = time(NULL);
gmtime()
将time_t
转换为UTC(GMT)时区的年,月,日等结构。
ts = *gmtime(&now);
现在出现了编码问题:
strftime(buf, sizeof(buf), "%a %Y-%m-%d %H:%M:%S %Z", &ts);
strftime()
可能(@Jasen)不知道&ts
的时区。相反,它获取了区域设置的时区。根据is_daylight_time字段ts.tm_isdst
调整该结果。所以以下内容没有意义。
ts = *gmtime(&now); // UTC/GMT time
strftime(buf, sizeof(buf), "... %Z ...", &ts); // print local standard time name
改为使用
ts = *gmtime(&now);
strftime(buf, sizeof(buf), "%a %Y-%m-%d %H:%M:%S UTC", &ts);
考虑ISO 8601格式
strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%SZ", &ts);
// 2015-01-06T03:51:57Z
答案 1 :(得分:1)
答案 2 :(得分:0)
您所在的时区是IST" Asia / Calcutta" (我从格林威治标准时间5:30偏移后无法找到任何其他内容)
但它作为CST打印的GMT表明您的计算机时钟严重错误配置。
您发布的代码在这里工作正常。我不能挑起它来打印CST而不是GMT。