Есть ли способ получить дату ... желательно в формате YYYYMMDD ... в часовом поясе Австралии/Сиднея (а не только в GMT + 11) ..... через C++ on Linux?Дата в другом часовом поясе: C++ на Linux
Спасибо,
Roger
Есть ли способ получить дату ... желательно в формате YYYYMMDD ... в часовом поясе Австралии/Сиднея (а не только в GMT + 11) ..... через C++ on Linux?Дата в другом часовом поясе: C++ на Linux
Спасибо,
Roger
Да, но вы просто использовать стандартные механизмы с библиотекой.
установить нужный часовой пояс в среде, создавая строку:
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, что определенно намного проще.
Использование 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;
См:
Новый ответ на старый вопрос:
Используя этот 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.