将UTC时间戳转换为C中的纪元时间[重复]

Posted

技术标签:

【中文标题】将UTC时间戳转换为C中的纪元时间[重复]【英文标题】:Conversion of UTC timestamp to epoch time in C [duplicate] 【发布时间】:2019-04-19 09:48:43 【问题描述】:

考虑到 C 语言中的 DST,我想将 UTC 时间戳转换为纪元时间秒。我正在 VS 2005 上进行开发,因为这是旧产品。我浏览了各种网站,但都没有用。

我们可以通过 boost 库做到这一点,但不建议这样做。

我将输入作为“2017-03-12T01:00:00Z”(即 UTC 时间戳)传递,我想要它的纪元时间,即以秒为单位。当我将此纪元时间转换回 UTC 时间时,它应该给我准确的结果作为输入时间戳。

【问题讨论】:

升压?在 C?怎么样? @SouravGhosh C 和 C++ 混合的产物。 没关系,但我从来不知道 boost 可以在 C 中使用 @SouravGhosh 它只需要 C++ 中的 cdecl 包装函数,可以从 C 中调用,然后使用 boost。 @hyde 技术上是正确的..但它值得吗?抱歉,如果我之前的陈述不清楚。 :) 【参考方案1】:

您可以使用mktime()

根据手册页,你必须解析输入并填写结构tm,定义为

struct tm 
    int tm_sec;         /* seconds */
    int tm_min;         /* minutes */
    int tm_hour;        /* hours */
    int tm_mday;        /* day of the month */
    int tm_mon;         /* month */
    int tm_year;        /* year */
    int tm_wday;        /* day of the week */
    int tm_yday;        /* day in the year */
    int tm_isdst;       /* daylight saving time */
;

然后,拨打mktime() as

time_t result;
result = mktime(&t);

注意点:请阅读链接手册并检查结构成员的适用值,尤其是

tm_mon

自一月以来的月数,范围为 0 到 11。

tm_year

自 1900 年以来的年数。

【讨论】:

当我将 UTC 时间戳转换为“tm”结构并将其传递给 mktime() 时,它会产生纪元时间,但是当我再次使用 gmtime() 将纪元时间转换回“tm”结构时,间隔 8 小时。 @Prashant 请显示无效的代码。 当我将 UTC 时间戳转换为“tm”结构并将其传递给 mktime() 时,它会产生纪元时间,但是当我再次使用 gmtime() 将纪元时间转换回“tm”结构时,有8小时的差距。例如 tm localTMTest; localTMTest.tm_year = 2017 - 1900; localTMTest.tm_mon = 3 - 1; localTMTest.tm_mday = 12; localTMTest.tm_hour = 0; localTMTest.tm_min = 0; localTMTest.tm_sec = 0; localTMTest.tm_isdst = -1; time_t localTimeTest = mktime(&localTMTest);结构 tm *ptm = gmtime(&localTimeTest);在 ptm 中,小时设置为 8,因为我的时区设置为“UTC-8 PST” @Prashant 我没看到,请查看this。 谢谢苏拉夫。但在我的系统上,由于时区有效,它显示 8 小时。当我使用 IST 时区运行时,由于 +05.30 时差,日期为 11,时间为 18:30。

以上是关于将UTC时间戳转换为C中的纪元时间[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将纪元时间转换为人类日期时间字符串,无需夏令时转换

如何将特定时间转换为UTC时间戳[重复]

Hive日期格式转换详解(包含13位时间戳转毫秒时间)

在Java中将ISO 8601时间戳字符串转换为纪元秒[重复]

如何将当前 UTC 时间转换为 Linux 时间戳 [重复]

将特定时区中的日期转换为 Python 中的时间戳