Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > 29 матра - перевод часов


Автор: chaos 17.4.2009, 12:44
Всплыла ошибка в программе :( связанная с переводом часов.
Не могу понять то ли это косяк в либе ACE или же она типо слишком умная и сделала это за меня
Код

    struct tm stm;
    ACE_OS::memset(&stm, 0, sizeof(stm));
    stm.tm_year = 2009 - 1900;
    stm.tm_mon = 3 - 1;
    stm.tm_mday = 29;
    stm.tm_hour = 0;
    stm.tm_min = 0;
    stm.tm_isdst = -1;
    ACE_Time_Value value(ACE_OS::mktime(&stm));

    ACE_Date_Time tmp(value);
    ACE_DEBUG((LM_DEBUG, ACE_TEXT("%d-%02d-%02d %02d:%02d:%02d\n"),
            tmp.year(), tmp.month(), tmp.day(), tmp.hour(), tmp.minute(), tmp.second()));

    value += 10 * 3600;
    tmp.update(value);
    ACE_DEBUG((LM_DEBUG, ACE_TEXT("%d-%02d-%02d %02d:%02d:%02d\n"),
            tmp.year(), tmp.month(), tmp.day(), tmp.hour(), tmp.minute(), tmp.second()));

    ACE_Time_Value v2 = value;
    tmp.update(v2);
    v2 -= ACE_Time_Value(tmp.hour() * 3600 + tmp.minute() * 60 + tmp.second());
    tmp.update(v2);
    ACE_DEBUG((LM_DEBUG, ACE_TEXT("%d-%02d-%02d %02d:%02d:%02d\n"),
            tmp.year(), tmp.month(), tmp.day(), tmp.hour(), tmp.minute(), tmp.second()));

    ACE_ASSERT(value == v2);


суть в том что я к дате прибавляю некий час(больше 3) потом с результатом что-то делаю в другом месте и там же отрезаю часы минуты секунды. так изврщаться пришлось иза либы в которой нет нормальной обертки для работы со временем.(может у меня рожа кривая)

так вот 29 марта 2009г я прибавил к этой дате 10 часов. что-то поделал нужное и потом отрезал эти 10 часов способом показанным выше.

в результате
Код

2009-03-29 00:00:00
прибавил 10 часов
2009-03-29 11:00:00
отнял якобы 10 часов, по факту 11
2009-03-28 23:00:00



как можно решить проблему - что бы при прибавлении 10 часов время стало 
Код

2009-03-29 10:00:00
 как например в бусте(можно заюзать boost::date_time, но пока хочется решить проблему малой кровью smile )
Код

boost::gregorian::date d(2009, 3, 29);
boost::posix_time::ptime value2(d);
std::cout << value2 + boost::posix_time::hours(10) << std::endl;

Код

2009-Mar-29 10:00:00




Заранее благодарен!

Автор: math64 17.4.2009, 13:35
А какой у тебя компилятор? C++ Builder 5.0 считает что время перевоится в первое воскренье апреля, как в Америке, а Windows переводит часы, как положено, в последнее воскренье марта. В течение недели mktime() и т.д. работают неправильно.

Автор: chaos 17.4.2009, 13:49
math64, компиллер у меня gcc ms, но тут дело не в компилеер. дело в том что ACE делает лишнее на мой взгляд. вот хочется ухеать как это отключить smile по возможности не переписывая много

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