Я думаю, что следующая программа должна выводить секунды до 1970 в первый день каждого года с 1 AD по 1970, предваряя размер time_t
в системе, на которой она скомпилирована (CHAR_BIT
- это макрос, поэтому я думаю, что вы не можете просто скопировать скомпилированный исполняемый файл и предположим, что он правильный, хотя на практике в наши дни все использует 8-битные char
).
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
void do_time(int year)
{
time_t utc;
struct tm tp;
memset(&tp, 0, sizeof(tp));
tp.tm_sec = 0;
tp.tm_min = 0;
tp.tm_hour = 0;
tp.tm_mday = 1;
tp.tm_mon = 0;
tp.tm_year = year - 1900;
tp.tm_wday = 1;
tp.tm_yday = 0;
tp.tm_isdst = -1;
printf("%d %ld\n",year, mktime(&tp));
}
int main(){
printf("time_t is %lu bits\n",sizeof(time_t)*CHAR_BIT);
for (int i = 1; i<1971; i++)
do_time(i);
exit(0);
}
Однако в OS X (10.11.3 15D21) это работает только для лет >= 1902, несмотря на то, что time_t
имеет 64-битную подпись. Я мог бы потенциально понять, если бы программисты Apple были ленивы и не поддерживали какие-либо годы до 1970 года, но правильное поведение, начиная с 1902 года, а затем останавливаясь, больше похоже на ошибку с моей стороны.
if (yourtm.tm_year < 0) return WRONG
с загадочным (по крайней мере для меня) комментарием/* Don't go below 1900 for POLA */
. Это все еще не полностью объясняет ваше наблюдение, хотя ... - person Martin R   schedule 09.02.2016mktime
вместоgmtime
.mktime
зависит от часового пояса, и 1900/01/01 00:00:00 в вашем часовом поясе может выпасть из диапазона 1900+ для GMT. Но это не объяснило бы проблему с 1901 годом. - person Kurt Stutsman   schedule 09.02.2016tp.tm_wday
иtp.tm_yday
не требуется перед вызовомmktime()
. Тоже никакого вреда. - person chux - Reinstate Monica   schedule 09.02.20160001-01-01
сложно, учитывая эволюцию календарей (григорианский, юлианский, римская республика) и т. д. Лучше думать о1970-01-01
как о значении нескольких секунд (эпохе) и отсчете времени от этого. IOWs, преобразованиеtime_t
в древние даты - это полная банка червей. Попробуйте день рождения Вашингтона - person chux - Reinstate Monica   schedule 10.02.2016