【发布时间】:2016-10-09 09:38:25
【问题描述】:
我想在微控制器上使用mktime(或至少使用 32 位宽的时间戳)。我从avr libc source files 添加了所需的文件(在 Atmel Studio 7 中,时间函数不可用),没有更改算法。但是对于 2016.06.08.23:34:00(UTC+1,欧盟夏令时),mktime 返回518736960,但它应该返回1465425240。
set_zone(ONE_HOUR);
set_dst(eu_dst);
struct tm myTime;
myTime.tm_sec = 0;
myTime.tm_min = 36;
myTime.tm_hour = 23;
myTime.tm_mday = 8;
myTime.tm_mon = 5;
myTime.tm_year = 116;
myTime.tm_isdst = ONE_HOUR;
time_t tim = mktime(&myTime);
我做错了什么?这些功能应该可以正常工作。
【问题讨论】:
-
“标准库”?不,这是一个包含一些非标准函数的 C 库实现。我们不知道幕后还有哪些其他不可移植的行为。
-
tm::tm_isdst如果 DST 有效,则为正数,如果无效则为零,如果没有可用信息,则为负数 - 将其发送到ONE_HOUR几乎没有意义。省略非标准部分 -set_zone()和set_dst()并设置tm_isdst==0看看结果如何。如果您设置的时间是您不想要的时间(即已经调整),则不需要时区或 DST 调整。 -
Better to first
struct tm myTime = {0};asstruct tm可能有其他实现定义字段未由 OP 代码设置。 -
@klenium :我的建议不是为了解决问题,而是为了让您排除这些函数中出现错误的可能性,以便您可以确定问题是
mktime()- 这就是您调查软件错误的方式 - 分而治之。 -
@Clifford 我也曾怀疑过一个不同的日子,但不以为然,因为预期和实际之间的差异显然不是 100 的倍数(因此不是 3600*24 的倍数),因为时代是错误的,对于给定的时间戳,预期也必须是错误的。我曾假设 OP 的部分只有 1 oops。 IAC,阅读很棒的手册是个好主意。