2010-11-09 3 views

ответ

4

Да, но вы просто использовать стандартные механизмы с библиотекой.

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

std::string tz = "TZ=Australia/Sydney"; 
putenv(const_cast<char *>(tz.c_str())); 
tzset(); // Initialize timezone data 
time_t aTime = time(NULL); // get the time - this is GMT based. 
struct tm retTime; 
localtime_r(aTime, &retTime); // Convert time into current timezone. 
char destString[1024]; 
strftime(destString, 1023, "%Y%m%d %Z", &retTime); // Format the output in the local time. 
std::cout << destString << std::endl; 

Проблема заключается в том, что этот код не является потокобезопасным - несколько потоков изменение информации часового пояса не заканчивается хорошо.

This Answer Дает вам возможность сделать это с помощью boost, что определенно намного проще.

1

Использование Boost.DateTime (Внимание: Не тестировался, только для целей иллюстрации)

// Load the timezone database 
tz_database db; 
// TODO: Adjust this path to your environment 
db.load_from_file("./boost/libs/date_time/data/date_time_zonespec.csv"); 

// Get the Sydney timezone 
time_zone_ptr sydney_zone = db.time_zone_from_region("Australia/Sydney"); 

// Current date/time in Sydney 
local_date_time sydney_time = local_sec_clock::local_time(sydney_zone); 

// Format sydney_time in desired format 
std::ostringstream formatter; 
formatter.imbue(std::locale(), new local_time_facet("%Y%m%d")); 
formatter << sydney_time; 

См:

1

Новый ответ на старый вопрос:

Используя этот cross platform, open source C++11/C++14 timezone library можно написать:

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

int 
main() 
{ 
    using namespace std::chrono; 
    using namespace std; 
    using namespace date; 
    auto ymd = make_zoned("Australia/Sydney", system_clock::now()); 
    cout << format("%Y%m%d", ymd) << '\n'; 
} 

Который только выход для меня:

20150824 

Это поточно. Он так же обновлен, как и копия IANA timezone database, которую вы только что загрузили. И если ваша дата не будет «сейчас», она будет правильно использовать исторические данные из базы данных IANA.

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