Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Странности и localtime


Автор: JekaZZ 5.4.2010, 18:06
Столкнулся с такой вот аномалией. 

Код

SomeClass::SomeClass(int day, int month, int year)
{
    struct tm tm_date;

    tm_date.tm_year = year - 1900;
    tm_date.tm_mon = month - 1;
    tm_date.tm_mday = day;
    tm_date.tm_hour = 0;
    tm_date.tm_min = 0;
    tm_date.tm_sec = 0;

    m_date = mktime(&tm_date); // m_date - член класса типа time_t
}

int SomeClass::day() const
{
    tm tm_this;
    localtime_r(&m_date, &tm_this);
    return tm_this.tm_mday;
}


Создаём объект класса, передавая ему день, месяц, год. Дальше идет какой-то код. Потом хотим получить день. И оказывается, что день возвращается на 1 меньше, и только для месяцев, меньших текущего. От года и дня это не зависит. Методом всё того же научного тыка был придуман костыль: если в конструкторе после m_date = mktime(&tm_date);  вызвать char* s = ctime(&m_date);, то при последующем вызове SomeClass::day() возвращается правильный день. 

Код

$ g++ --version
g++ (Ubuntu 4.4.1-4ubuntu9) 4.4.1

Из опыта знаю, что когда что-то не получается, то глючит не что-то, а я сам. Но здесь......

Автор: borisbn 5.4.2010, 20:03
А что за функция localtime_r? MSDN такую не знает

Автор: JekaZZ 5.4.2010, 21:06
То же самое, что и localtime, только не возвращает значение tm, а записывает его во второй параметр. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)