我需要知道当前的 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);
这给了我以下输出 --> Time::Sat 2015-01-10 00:14:34 CST 它将在本地时间中添加 5 小时 30 分钟,而不是减去 5 小时 30 分钟。 谁能告诉我为什么会发生这种情况?
最佳答案
[编辑]重新思考这个问题。
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
关于在C中将UTC时间转换为unix时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27860919/