Простой posix: вызовите tzset, используйте tzname .
#include <ctime>
tzset();
time_zone_ptr zone(new posix_time_zone(tzname[localtime(0)->tm_isdst]));
Posix с glibc / bsd дополнениями:
time_zone_ptr zone(new posix_time_zone(localtime(0)->tm_zone));
Выше приведены сокращения Часовые пояса Posix , определенные в терминах смещения от UTC и нестабильные во времени (есть более длинная форма, которая может включать переходы DST, но не политические и исторические переходы).
ICU является портативным и имеет логику для извлечения системного часового пояса как часового пояса Олсона (фрагмент sumwale ):
// Link with LDLIBS=`pkg-config icu-i18n --libs`
#include <unicode/timezone.h>
#include <iostream>
using namespace U_ICU_NAMESPACE;
int main() {
TimeZone* tz = TimeZone::createDefault();
UnicodeString us;
std::string s;
tz->getID(us);
us.toUTF8String(s);
std::cout << "Current timezone ID: " << s << '\n';
delete tz;
}
В Linux ICU реализован так, чтобы быть совместимым с tzset и смотрит на TZ
и /etc/localtime
, который в современных системах Linux считается символической ссылкой, содержащей идентификатор Олсона ( вот история ). См. uprv_tzname
для деталей реализации.
Boost не знает, как использовать идентификатор Олсона. Вы можете построить posix_time_zone
, используя смещения не-DST и DST, но на этом этапе лучше продолжать использовать реализацию ICU. См. FAQ по бусту .