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

标签 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);

这给了我以下输出 --> 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/

相关文章:

c - 重写 GCC 内联汇编以不需要 volatile 或内存破坏

c - 正则表达式测试台

c - TCP头端口号偶尔为0

Windows 中区分大小写的目录路径

c - 以下代码片段的输出应该是什么?为什么?

c - 使用 C 返回数组

c - 尝试使用 main.c 中头文件中的函数时获取架构 x86_64 的 undefined symbol

c - 类型转换能持续多久? (C)

c - 从 C 中按值传递的结构打印

C信号代码混淆