标准C-如何使用1970年1月1日以外的unix历元时间戳?

标准C-如何使用1970年1月1日以外的unix历元时间戳?,c,unix-timestamp,epoch,time-t,C,Unix Timestamp,Epoch,Time T,时间戳定义为自UTC 2000年1月1日午夜以来经过的秒数。仅使用标准C,如何获得纪元为2000年UTC 1月1日而非1970年1月1日的unix时间戳 time(NULL)返回自1970年1月1日以来的秒数 time_t seconds; seconds = time(NULL); 我想,我花了这么多时间试图弄明白这一点,其他人可能会从中受益。如果您有一个要求,在标准C中,您希望查找自1970年1月1日以外的历元以来经过的时间,那么您可以这样做 time_t secondsY2K = 94

时间戳定义为自UTC 2000年1月1日午夜以来经过的秒数。仅使用标准C,如何获得纪元为2000年UTC 1月1日而非1970年1月1日的unix时间戳

time(NULL)
返回自1970年1月1日以来的秒数

time_t seconds;
seconds = time(NULL); 

我想,我花了这么多时间试图弄明白这一点,其他人可能会从中受益。如果您有一个要求,在标准C中,您希望查找自1970年1月1日以外的历元以来经过的时间,那么您可以这样做

time_t secondsY2K = 946684800; // Epoch / Unix timestamp for Jan 1, 2000 https://www.epochconverter.com/timestamp-list
time_t unixEpochTime;
time(&unixEpochTime);
double seconds = difftime(unixEpochTime , epochY2k);
printf("seconds since jan 1, 2000 %.f", seconds);
printf("current time in UTC %s\n", asctime(gmtime(&unixEpochTime)));        

看起来像是家庭作业。那你觉得呢?来吧,这个很简单。:-)标准C没有定义时代;它只说明
time\u t
是能够表示时间的实类型(整数或浮点)。POSIX确实将历元定义为1970年1月1日。@AlKepp我在下面发布了我的答案:)关键是计算出1970年以外年份的历元/unix时间戳(即0)@KeithThompson我花了几个小时才意识到!!只需减去2000-01-01T00:00:00Z和1970-01-01T00:00:00Z之间的秒数,
man
页面对函数的说明是:
time()
time()将时间作为从纪元1970-01-01 00:00+0000(UTC)开始的秒数返回。如果tloc为非NULL,则返回值也存储在tloc指向的内存中。因此,不,参数不是用来改变历元的。那么,使用这个奇妙的
-
操作符怎么样?@user3629249,看看我发布的历元/unix时间戳图表链接,1970年1月1日的unix/epoch时间戳为0(零),2000年1月1日的时间戳为946684800。这些时间戳可能不精确(闰秒等)调用时间(空);传递0秒,这样您就得到了自1970年以来经过的时间。@FelixPalmen:C不能保证减去
time\t
值会得到有意义的结果
time\u t
必须是能够表示时间的实数(整数或浮点)类型,但不需要线性表示。这就是为什么有一个
difftime()
函数。但是如果你不需要绝对的可移植性,你可以假设
time\u t
值是线性的,你通常是对的(POSIX要求
time\u t
是一个以秒为单位表示时间的整数类型)。如果你可以假设Y2K是
946684800
,您几乎可以肯定地假设
time\t
值上的减法按预期工作。(如果你想让你的代码非常容易移植,你可以使用
mktime()
)\