Я написал следующий фрагмент кода, чтобы перевести введенную дату к следующей календарной дате. Это хорошо работает при тестировании в фиктивном исходном файле, скомпилированном с 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);
}
Я не понимаю, почему это свидание может вызвать проблемы, но я не
понять, почему вы делаете вещи трудным путем. Просто добавьте один к
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
находится в некотором разумном диапазоне. Или, если вы можете повлиять на решение,
используйте какой-нибудь стандартный формат даты, так что вам не нужно.)
В любом случае, я подозреваю некоторую проблему в симуляторе, особенно если он работает с тем же значением локально.
Вы просто достигли целочисленного предела 2147483647, который затем округляется в меньшую сторону.
Всегда проверяйте в своем коде, если любое число превышает это значение ^^. переключение на unsigned должно исправить это (или просто переделать проблему на 4294967295)
РЕДАКТИРОВАТЬ: вы правы. Мой ответ неверный.