Ответ определенно зависит от реализации. Чтобы точно определить вашу платформу / компилятор, просто добавьте этот вывод где-нибудь в вашем коде:
printf ("sizeof time_t is: %d\n", sizeof(time_t));
Если ответ 4 (32 бита) и ваши данные выходят за пределы 2038 , то у вас есть 25 лет для переноса кода.
С вашими данными все будет в порядке, если вы сохраните ваши данные в виде строки, даже если это что-то простое, например:
FILE *stream = [stream file pointer that you've opened correctly];
fprintf (stream, "%d\n", (int)time_t);
Тогда просто прочитайте его обратно тем же способом (fread, fscanf и т. Д. В int), и у вас будет время смещения вашей эпохи. Подобный обходной путь существует в .Net. Я без проблем передаю 64-битные числа эпох между системами Win и Linux (через канал связи). Это поднимает проблемы с порядком байтов, но это уже другая тема.
Чтобы ответить на запрос Паксдиабло, я бы сказал, что он напечатал «19100», потому что программа была написана таким образом (и я признаю, что сделал это сам в 80-х):
time_t now;
struct tm local_date_time;
now = time(NULL);
// convert, then copy internal object to our object
memcpy (&local_date_time, localtime(&now), sizeof(local_date_time));
printf ("Year is: 19%02d\n", local_date_time.tm_year);
Оператор printf
печатает фиксированную строку «Year is: 19», за которой следует строка, дополненная нулями, с «Years from 1900» (определение tm->tm_year
). В 2000 году это значение, очевидно, равно 100. "%02d"
дополняется двумя нулями, но не усекается, если длиннее двух цифр.
Правильный путь (изменить только на последнюю строку):
printf ("Year is: %d\n", local_date_time.tm_year + 1900);
Новый вопрос: в чем причина этого мышления?