我试图通过使用下面的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 difference\n", seconds);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑: @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;
Run Code Online (Sandbox Code Playgroud)
tm_year是自1900年以来的一年,那么为什么我得到正确的输出,如果我在1876年到2012年之间取代1876年.
问题是 tm_year 是自 1900 年以来的年份,因此 2013 年将是 113 http://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;
Run Code Online (Sandbox Code Playgroud)
给定 2013 年,mktime 将返回 -1,因为无法表示日历时间。你可能会认为 3913 年是一个有效的日历时间,原因与Joni 指出的2038 年问题有关。