将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中的纪元时间[重复]的主要内容,如果未能解决你的问题,请参考以下文章
在Java中将ISO 8601时间戳字符串转换为纪元秒[重复]