Проблема с использованием ctime для продвижения данной даты к следующей календарной дате

Я написал следующий фрагмент кода, чтобы перевести введенную дату к следующей календарной дате. Это хорошо работает при тестировании в фиктивном исходном файле, скомпилированном с g ++ 4.1.2

Однако при запуске следующего кода из симулятора моей фирмы (сложные детали которого мне сейчас недоступны) он выходит из строя в 20021027 году; то есть для дат, отличных от 20021027, он работает, как предполагалось, но для 20021027 он возвращает сам 20021027.

Посоветуйте, пожалуйста, что может быть не так?

int nextday(const int &date, int n=1)
{
struct tm curr_time;

int yyyy = curr_time.tm_year = date/10000-1900;
int mm = curr_time.tm_mon=(date/100)%100-1;
int dd = curr_time.tm_mday=date%100;
curr_time.tm_min=0;
curr_time.tm_sec=0;
curr_time.tm_hour=0;

time_t next = mktime(&curr_time) + 24*60*60*n;
struct tm new_time;
localtime_r(&next,&new_time);
yyyy = 1900 + new_time.tm_year;
mm = 1 + new_time.tm_mon;
dd = new_time.tm_mday;
return (10000*yyyy+100*mm+dd);
}

0

Решение

Я не понимаю, почему это свидание может вызвать проблемы, но я не
понять, почему вы делаете вещи трудным путем. Просто добавьте один к
tm_mday поле перед вызовом mktime, а затем извлечь исправленные
значения из struct tm ты прошел в mktime, (Есть причина
почему указатель на mktime указывает на неконстантность.) Что-то вроде:

int
nextday( int date, int n = 1 )
{
tm broken_down;
broken_down.tm_year = date / 10000 - 1900;
broken_down.tm_mon = (date / 100) % 100 - 1;
broken_down.tm_mday = date % 100 + n;
broken_down.tm_hour = 12;  // avoid issues with summer time, etc.
broken_down.tm_min = 0;
broken_down.tm_sec = 0;
mktime( &broken_down );
return (broken_down.tm_year + 1900) * 10000
+  (broken_down.tm_mon + 1) * 100
+  broken_down.tm_mday;
}

(Возможно, вы захотите добавить некоторые проверки работоспособности, то есть проверить, что int
переданный действительно представляет дату в ожидаемом формате, и это
n находится в некотором разумном диапазоне. Или, если вы можете повлиять на решение,
используйте какой-нибудь стандартный формат даты, так что вам не нужно.)

В любом случае, я подозреваю некоторую проблему в симуляторе, особенно если он работает с тем же значением локально.

1

Другие решения

Вы просто достигли целочисленного предела 2147483647, который затем округляется в меньшую сторону.

Всегда проверяйте в своем коде, если любое число превышает это значение ^^. переключение на unsigned должно исправить это (или просто переделать проблему на 4294967295)

РЕДАКТИРОВАТЬ: вы правы. Мой ответ неверный.

0