2014-09-18 1 views
0

Я хочу построить struct tm с Australia/Sydney часовой пояс с, так что я первый использование:mktime неправильно для часового пояса Австралии?

setenv("TZ","Australia/Sydney",1); 
tzset() 

затем я установил struct tm как:

struct tm _tm; 
_tm.tm_sec = 0; 
_tm.tm_min = 45; 
_tm.tm_hour = 7; 
_tm.tm_mday = 18; 
_tm.tm_mon = 8; 
_tm.tm_year = 114; 

Это должно установить в Австралию время 2014/09/18 7 : 45: 00 тогда я называю:

time_t other_tm = mktime(&_tm); 

После этого вызова и other_tm и _tm указали на 6:45 утра по Австралии! Причина в том, что у other_tm есть значение 1410986700, которое вы можете проверить из Epoc-конвертера, которое действительно указано в 6:45 утра, у кого-нибудь есть идея, почему?

+0

Дайте это посмотреть на преобразования UTC: http://stackoverflow.com/a/3661129/3895252 –

+1

http://stackoverflow.com/questions/10533322/mktime-and-tm-isdst-flag –

+0

setenv и tzset служат для использования правильного часового пояса, так что mktime может использовать текущий локальный часовой пояс. Но это, похоже, не сработало. – user2426361

ответ

0

Используя этот cross-platform, free, open-source C++11/14 <chrono>-based library, вот это современный способ, чтобы получить желаемый результат:

#include "tz.h" 
#include <iostream> 

int 
main() 
{ 
    using namespace std::chrono_literals; 
    using namespace date; 
    auto zt = make_zoned("Australia/Sydney", local_days{2014_y/9/18} + 7h + 45min); 
    std::cout << zt.get_sys_time().time_since_epoch().count() << '\n'; 
} 

Это выходы:

1410990300 

(который 1410986700 + 3600)

Эта библиотека гораздо проще и безопаснее в использовании, чем устаревший API C для обработки времени.

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