Дата в другом часовом поясе: C ++ в Linux - PullRequest
6 голосов
/ 09 ноября 2010

Есть ли способ получить дату ... желательно в формате ГГГГММДД ... в часовом поясе Австралия / Сидней (не только GMT + 11) ..... через C ++ в Linux?

Спасибо,

Роджер

Ответы [ 3 ]

4 голосов
/ 09 ноября 2010

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

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

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;

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

Этот ответ Дает вам способ сделать это, используя повышение, которое определенно намного проще.

1 голос
/ 24 августа 2015

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

Используя эту кроссплатформенную библиотеку часовых поясов C ++ 11 / C ++ 14 с открытым исходным кодом можно написать:

#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 . И если ваша дата окажется не «сейчас», она будет правильно использовать исторические данные из базы данных IANA.

1 голос
/ 09 ноября 2010

Использование 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;

См.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...