Ваш код имеет неопределенное поведение, потому что вы не инициализируете других членов tm_time1
и tm_time2
. Быстрое решение проблемы:
struct tm time1 = { 0 };
struct tm time2 = { 0 };
Другая проблема заключается в сохранении возвращаемого значения difftime
типа double
в переменной time_t
. Разница во времени может быть отрицательной, а time_t
может иметь тип без знака, в результате чего rawtime / 86400
выдает большое положительное число. Вам, вероятно, следует использовать long
для хранения разницы во времени и отклонения данных, если эта разница окажется отрицательной.
Если эта проблема исправлена, long rawtime = difftime(mktime(&time1), mktime(&time0));
вычислит разницу во времени между двумя датами в 0: 00:00 утра в секундах.
Деление на 86400
не совсем корректно, поскольку разница может не быть точным кратным 86400, если в интервале было одно или несколько изменений местного времени из-за перехода на летнее время. Я предлагаю вам использовать:
total += (rawtime + 3600 * 3) / 86400; // difference in days, ignoring DST.
Альтернативно, вы можете определить rawtime
как double
и использовать:
total += round(rawtime / 86400.0);
Наконец, вычисления ts = *localtime(&rawtime);
не имеют никакого смысла вообще : преобразование количества секунд в дату имеет смысл только в том случае, если это количество секунд соответствует действительной дате. rawtime
- это продолжительность, а не действительная дата.