我试图使用以下 C 代码来获取两个日期之间的差异。
但代码总是给出差异 0。帮助我找出我犯错的地方。
我在 Linux 下使用 gcc 编译器。
#include <stdio.h>
#include <time.h>
int main ()
{
struct tm start_date;
struct tm end_date;
time_t start_time, end_time;
double seconds;
start_date.tm_hour = 0; start_date.tm_min = 0; start_date.tm_sec = 0;
start_date.tm_mon = 10; start_date.tm_mday = 15; start_date.tm_year = 2013;
end_date.tm_hour = 0; end_date.tm_min = 0; end_date.tm_sec = 0;
end_date.tm_mon = 10; end_date.tm_mday = 20; end_date.tm_year = 2013;
start_time = mktime(&start_date);
end_time = mktime(&end_date);
seconds = difftime(end_time, start_time);
printf ("%.f seconds differencen", seconds);
return 0;
}
编辑:@qchen答案对解决我的问题有很大帮助。还有一个疑问。以下是我的更新。从答案
start_date.tm_hour = 0; start_date.tm_min = 0; start_date.tm_sec = 0;
start_date.tm_mon = 10-1; start_date.tm_mday = 18; start_date.tm_year = 2013-1876;
end_date.tm_hour = 0; end_date.tm_min = 0; end_date.tm_sec = 0;
end_date.tm_mon = 10-1; end_date.tm_mday = 20; end_date.tm_year = 2013-1876;
tm_year 是自 1900 年以来的一年,那么如果我将 1876 替换为 1876 年至 2012 年之间的年份,为什么我会得到正确的输出。
问题是tm_year是自 1900 年以来的一年,所以 2013 年将是 113http://en.cppreference.com/w/cpp/chrono/c/tm
start_date.tm_hour = 0; start_date.tm_min = 0; start_date.tm_sec = 0;
start_date.tm_mon = 10; start_date.tm_mday = 15; start_date.tm_year = 113;
end_date.tm_hour = 0; end_date.tm_min = 0; end_date.tm_sec = 0;
end_date.tm_mon = 10; end_date.tm_mday = 20; end_date.tm_year = 113;
给定 2013 年,mktime 将返回 -1,因为无法表示日历时间。你会认为 3913 年是一个有效的日历时间,原因与 2038 年问题有关,正如 Joni 所指出
OP 没有检查 mktime()' 结果。
如@Joni所述,设置tm_isdst
字段。 如果您知道 DST 是如何应用的,请使用 0
或 1
,否则使用"-1"并让操作系统做出决定。
@qchen提到了 1900 年的偏移量,因为您可能想要.tm_year = 2013-1900
.
我断言根本问题是使用mktime()
而不进行(time_t) -1
。 对于健壮的代码,应测试此返回值,并缺少打开的 OP 代码以获得意外结果。
除了未正确指定年份外,您还将未设置tm_isdst
字段。 mktime
使用此字段来确定日期是否具有有效的夏令时,或者是否应从时区数据库中查找 DST 设置。这可能会使结果偏离一小时。添加以下行:
/* lookup if DST or not */
start_date.tm_isdst = -1;
end_date.tm_isdst = -1;