2013-05-02 5 views
3

У меня есть следующий тестовый код, чтобы увидеть разницу между gmtime и localtime. Но они дают мне один и тот же результат: UTC: 2013-05-02T13: 59: 58 Местное время: 2013-05-02T13: 59: 58Почему gmtime и localtime дают мне тот же результат?

time_t now; 
time(&now); 
tm *pTimeStruct = gmtime(&now); 
tm *plocalTimeStruct = localtime(&now); 

string timeStr = ""; 
char timeBuf[64] = {'\0'}; 

sprintf(timeBuf,"UTC:%-4.4d-%-2.2d-%-2.2dT%-2.2d:%-2.2d:%-2.2d " 
    "Local:%-4.4d-%-2.2d-%-2.2dT%-2.2d:%-2.2d:%-2.2d", 
    (pTimeStruct->tm_year + 1900), 
    (pTimeStruct->tm_mon + 1), 
    pTimeStruct->tm_mday, 
    pTimeStruct->tm_hour, 
    pTimeStruct->tm_min, 
    pTimeStruct->tm_sec, 
    (plocalTimeStruct->tm_year + 1900), 
    (plocalTimeStruct->tm_mon + 1), 
    plocalTimeStruct->tm_mday, 
    plocalTimeStruct->tm_hour, 
    plocalTimeStruct->tm_min, 
    plocalTimeStruct->tm_sec); 

timeStr += timeBuf; 
cout << timeStr << endl; 

EDIT:

Я в восточному времени зона.

EDIT2:

обновленный код использование дифф структура, но получил тот же результат:

 time_t now; 
     time(&now); 
     time_t now2; 
     time(&now2); 
     tm *pTimeStruct = gmtime(&now); 
     tm *plocalTimeStruct = localtime(&now2); 
+0

В какой системе вы работаете? –

+0

linux machine, fedora – 5YrsLaterDBA

ответ

7

необходимо скопировать значения между вызовами gmtime и localtime:

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

говорит о странице человека в моей системе. Это обычное поведение, по крайней мере, в Linux.

+0

'tm gmtimestruct; memcpy (& gmtimestruct, gmtime (& now), sizeof gmtimestruct); 'будет вести себя так, как ожидалось. – wallyk

+0

Пожалуйста, ознакомьтесь с моим обновлением, используйте другую структуру, тот же результат. – 5YrsLaterDBA

+2

@ 5YrsLaterDBA Вы все еще не * скопировали результат * вызова. Вы просто сохранили тот же указатель в двух разных местах. Например, 'tm timeStruct = * gmtime (&now);' –

0

Я также имел эту проблему и решить ее с помощью тетсру:

time_t t = time(NULL); 

tm* gmt = (tm*)malloc(sizeof(tm)); 
memcpy(gmt, gmtime(&t), sizeof(tm)); 

tm* loc = localtime(&t); 

cout << asctime(gmt) << endl; 
cout << asctime(loc) << endl; 

free(gmt); 
2

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

struct tm *gmtime_r(const time_t *timep, struct tm *result); 
struct tm *localtime_r(const time_t *timep, struct tm *result); 

Примечание для пользователей Windows: _gmtime_s и _localtime_s являются версиями Microsoft.

errno_t _gmtime_s(struct tm* _tm, const __time_t* time); 
errno_t _localtime_s(struct tm* _tm, const time_t *time);