获取 C 中特定日期的纪元秒数

Posted

技术标签:

【中文标题】获取 C 中特定日期的纪元秒数【英文标题】:Get epoch seconds for specific date in C 【发布时间】:2018-05-18 07:31:33 【问题描述】:

如何获取自 1970 年 1 月 1 日以来特定日期经过的秒数,例如:“2017-09-14 23:24:46”

#include <stdio.h>
#include <stdint.h>
#include <time.h>
int main()


    struct tm tmVar;
    time_t timeVar;
    sscanf("2017-09-14 23:24:46","%d-%d-%d %d:%d:%d",&tmVar.tm_year
                        ,&tmVar.tm_mon, &tmVar.tm_mday,
                         &tmVar.tm_hour, &tmVar.tm_min, 
                         &tmVar.tm_sec);
     tmVar.tm_isdst = 1;
     printf("tm_year :%d\n",tmVar.tm_year);
     printf("tm_month :%d\n",tmVar.tm_mon);
     printf("tm_day :%d\n",tmVar.tm_mday);
     printf("tm_hour :%d\n",tmVar.tm_hour);
     printf("tm_min :%d\n",tmVar.tm_min);
     printf("tm_sec :%d\n",tmVar.tm_sec);
     timeVar = mktime(&tmVar);
     printf("time %d\n",timeVar);
 

但是输出不是我所期望的:

tm_year :2017

tm_month :9

tm_day :14

tm_hour :23

tm_min :24

tm_sec :46

时间 1336625342

根据epochconverter.com,正确的值应该是1510529086。为什么我没有得到这个值?

【问题讨论】:

不是秒数 对于epochconverter.com,输出将是1510529086 执行此操作的可移植方法是计算“2017-09-14 23:24:46”的 time_t 和“1970 年 1 月 1 日”的 time_t ,然后使用 @987654326 @ 区别。 【参考方案1】:

您需要调整存储在结构中的值。

tm_year 字段是自 1900 年以来的年份,因此请从该值中减去 1900。

tm_mon 字段是自一月以来的月份,因此从该值中减去 1。

所以在填充结构之后执行以下操作:

 tmVar.tm_year -= 1900;
 tmVar.tm_mon--;

输出:

tm_year :117
tm_month :8
tm_day :14
tm_hour :23
tm_min :24
tm_sec :46
time 1505445886

【讨论】:

@MiguelÁngelRetamozoSanchez 很高兴我能帮上忙。如果您觉得有用,请随时 accept this answer。

以上是关于获取 C 中特定日期的纪元秒数的主要内容,如果未能解决你的问题,请参考以下文章

获取表示当前日期的纪元时间戳范围

从纪元到相对日期的秒数

在比较 jwt.iat(发布于)属性与当前日期时间时遇到问题 - (“自纪元以来的秒数”NumericDate)

在linux bash中将ISO日期转换为纪元以来的秒数

是否有 perl 5.005 核心模块可以将纪元秒数转换为日期时间字符串?

自上一个纪元以来的秒数的 T-Sql 日期格式/sqlite 输入的格式