用C语言将UTC时间转换为unix时间戳

用C语言将UTC时间转换为unix时间戳,c,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); 这给了我以下输出-->时间:

我需要知道当前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);
这给了我以下输出-->时间::Sat 2015-01-10 00:14:34 CST,它将本地时间增加5小时30分钟,而不是减少5小时30分钟。 有人能告诉我为什么会发生这种情况吗?

的返回值已在UTC中:

time()将时间返回为自历元1970-01-01 00:00:00+0000(UTC)以来的秒数

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

请调整您的时钟 你的时区是“亚洲/加尔各答”(我找不到任何其他与格林尼治标准时间5:30偏移的时区)

但它的打印时间是格林尼治标准时间(GMT),因为CST ths表明您的计算机时钟配置严重错误


你发布的代码在这里运行良好。我不能让它打印CST而不是GMT。重新考虑这个问题

OP想要一个。这种时间戳是自1970年1月1日以来的秒数。这可能只不过是以下几点

sprintf(buffer, "%lld", (long long) time(NULL));
奥托,OP似乎也想要年-月-日-小时:分钟:秒。这不是UNIX时间戳。这只是一个时间戳,本答案的其余部分讨论了一种可移植的推导方法


time()
返回一些能够表示时间的实类型。它通常是某种整数类型,表示自1970年1月1日起的秒数0:00:00(或)

gmtime()
时间转换为UTC(GMT)时区的年、月、日等结构

ts = *gmtime(&now);

现在出现了一个编码问题:

strftime(buf, sizeof(buf), "%a %Y-%m-%d %H:%M:%S %Z", &ts);
strftime()。相反,它获取区域设置的时区。该结果根据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);

考虑格式


以下是可能的解决方案:您现在看到的
的价值是什么?你当地的实际时间是多少?公布的代码不应该有任何偏移量。我觉得这个问题有点不对劲。我发现有些版本的strftime可以确定gmtime的GMT,有些则不能。这似乎是一个BSD版本。一些版本的
struct_tm
包括
tm_gmtoff
(int,以东秒数)和
tm_区域
,它们给出了区域的文本表示。@Jasen编辑以包含您的见解。
ts = *gmtime(&now);
strftime(buf, sizeof(buf), "%a %Y-%m-%d %H:%M:%S UTC", &ts);
strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%SZ", &ts);
//  2015-01-06T03:51:57Z