将UTC时间转换为C中的unix时间戳

时间:2015-01-09 12:47:07

标签: c

我需要知道当前的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分钟。 谁能告诉我为什么会这样?

3 个答案:

答案 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)

time()的返回值已经是UTC:

  

time()返回自Epoch,1970-01-01 00:00:00 +0000(UTC)以来的秒数。

我不清楚为什么要进行进一步处理。

答案 2 :(得分:0)

修复你的时钟

您所在的时区是IST" Asia / Calcutta" (我从格林威治标准时间5:30偏移后无法找到任何其他内容)

但它作为CST打印的GMT表明您的计算机时钟严重错误配置。

您发布的代码在这里工作正常。我不能挑起它来打印CST而不是GMT。