2012-06-15 3 views
2

В чем разница между этими двумя функциями? Насколько я понимаю, они должны быть одинаковыми: http://www.gnu.org/software/libc/manual/html_node/Broken_002ddown-Time.html.Разница между mktime и timelocal

Я написал этот код, чтобы проверить конверсию (Qt часть только для сравнения):

#include <QCoreApplication> 
#include <QDateTime> 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    QDateTime datetime(QDate(2012, 3, 25), QTime(5, 15)); 
    qDebug("Timestamp: %lld.", datetime.toMSecsSinceEpoch()/1000L); 

    time_t timestamp; 
    tm* timeinfo = localtime(&timestamp); 
    timeinfo->tm_hour = 5; 
    timeinfo->tm_mday = 25; 
    timeinfo->tm_min = 15; 
    timeinfo->tm_mon = 2; 
    timeinfo->tm_year = 112; 
    timeinfo->tm_sec = 0; 
    qDebug("Timestamp: %ld.", timelocal(timeinfo)); 

    return 0; 
} 

и выяснили, что выход:

Timestamp: 1332645300. 
Timestamp: 1332645300. 

, который является то, что я бы ожидать. Тогда я заменил timelocal с mktime и выяснили, что это был выход:

Timestamp: 1332645300. 
Timestamp: 1332648900. 

Похоже было добавлено в час (считают, что мой текущий часовой пояс GMT + 2: 00 и мой локаль установлена ​​в Италии). Зачем? В чем разница между двумя и почему mktime добавляет 1 час к дате, которую я установил?

EDIT: Я проверил еще раз, и это, кажется, что на Mac OS X (и IOS) timelocal возвращается в тот же час, помещенном в timeinfo структуры, в то время как mktime на самом деле добавление час как в возвращенном time_t значения и в структура tm.

В Linux Kubuntu вместо этого, с обеими функциями, я получаю, что час добавляется и к структуре tm, и к возвращаемому значению.

Любой, кто может объяснить, почему?

+0

Я скомпилирован с компилятором C++. –

+0

Но вы отметили его как C, поэтому будьте последовательны. Теперь я [запускаю ваш код] (http://ideone.com/M7Ik7), и кажется, что результаты те же ... –

+0

Я добавил некоторые детали к моему вопросу. На какой платформе вы работаете? –

ответ

5

Человек timelocal состояний в OpenBSD:

timelocal является устаревшим интерфейсом, который эквивалентен вызову mktime() с отрицательным значением для tm_isdst

Отрицательное значение tm_isdst означает, что timelocal Безразлично Примите во внимание летнее время (DST). Кажется, что QDateTime имеет проблемы с DST.
mktime с другой стороны, ручки DST и это могло бы объяснить разницу в 1-часовой на OS X.

Так как timelocal устарела, она может иметь новые imlementations, которые имеют дело с DST правильно.

Смежные вопросы