Странная ситуация. Проверьте this Coliru code:C++ и mktime: 26/6/1943 и 27/6/1943 в тот же день
#include <iostream>
#include <utility>
#include <ctime>
using namespace std;
#define SEGS 60
#define MINS 60
#define HOURS 24
int days(tm* date1, tm* date2)
{ return (mktime(date1) - mktime(date2))/SEGS/MINS/HOURS; }
tm mkdate(int day, int mon, int year)
{
tm date = {0, 0, 0};
date.tm_mday = day;
date.tm_mon = mon - 1;
date.tm_year = year - 1900;
return date;
}
int main()
{
tm date1 = mkdate(31, 12, 2030);
tm date2 = mkdate(1, 1, 2000);
cout << days(&date1, &date2) << endl;
// 11322... OK 30 * 365 (1/1/2000 - 1/1/2030)
// + 8 (leap years) + 364 (from 1/1/2030 - 31/12/2030).
date1 = mkdate(31, 12, 2030);
date2 = mkdate(1, 1, 1930);
cout << days(&date1, &date2) << endl;
// 36889... OK; but in my machine, it returns 36888.
date1 = mkdate(31, 12, 1943);
date2 = mkdate(1, 1, 1943);
cout << days(&date1, &date2) << endl;
// 364... OK: but in my machine, it returns 363.
date1 = mkdate(30, 6, 1943);
date2 = mkdate(1, 6, 1943);
cout << days(&date1, &date2) << endl;
// 29... OK; but in my machine, it returns 28.
date1 = mkdate(27, 6, 1943);
date2 = mkdate(26, 6, 1943);
cout << days(&date1, &date2) << endl;
// 1... OK; but in my machine, it returns 0.
return 0;
}
Комментарии после каждого примера те из Coliru и мой ноутбук. Выходы Coliru верны, но моя машина печатает неверные цифры.
Если вы прочитали код, разница между днями правильно вычисляется (первый пример, с 1/1/2000 по 31/12/2030).
Но если год 1943 находится в середине интервала даты, кажется, что день потерян. Второй пример: 1/1/1930 - 31/12/2030.
После многих испытаний я выяснил, что проблема была в Juny/1943. Третий пример: 1/6/1943 - 30/6/1943, вернувшийся на 28 дней вместо 29.
Более конкретно, это похоже на 26-е и 27-е числа в тот же день. Четвертый пример: 26/6/1943 - 27/6/1943, возвращение 0 дней.
Моя машина Ubuntu 14.02.2 LTS с Linux 3.13.0-52-generic x86_64, с использованием gcc (g ++) 4.8.2.
В чем проблема? Какая-то ошибка в реализации GNU libc?
Каков ваш часовой пояс? Возможно, это что-то вроде [этого] (https://stackoverflow.com/questions/6841333/why-is-subtracting-these-two-times-in-1927-giving-a-strange-result/6841479#6841479)? – Nobody
Разве вы не пытались точно определить проблему? Распечатайте значения tm для определенных временных моментов в этот день и найдите, сколько секунд точно потеряно и какой момент? – Petr
Я пробовал свой код и в своей системе Debian 7.8 (Италия), все в порядке: 11322, -12821, 364,26,1 – LPs