在我见过的大多数例子中:
time_zone_ptr zone( new posix_time_zone("MST-07") );
但我只想获取运行代码的机器的当前时区。我不想硬编码时区名称。
在我见过的大多数例子中:
time_zone_ptr zone( new posix_time_zone("MST-07") );
但我只想获取运行代码的机器的当前时区。我不想硬编码时区名称。
普通 posix:调用 tzset,使用 tzname。
#include <ctime>
tzset();
time_zone_ptr zone(new posix_time_zone(tzname[localtime(0)->tm_isdst]));
带有glibc/bsd添加的 Posix :
time_zone_ptr zone(new posix_time_zone(localtime(0)->tm_zone));
以上是缩写Posix timezones,根据与 UTC 的偏移量定义,并且随着时间的推移不稳定(有更长的形式可以包括 DST 转换,但不包括政治和历史转换)。
ICU是可移植的,并且具有将系统时区检索为 Olson 时区的逻辑(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
and /etc/localtime
,在最近的 Linux 系统上,它被指定为包含 Olson 标识符的符号链接(这里是历史记录)。见uprv_tzname
实施细节。
Boost 不知道如何使用 Olson 标识符。您可以使用非 DST 和 DST 偏移量构建一个posix_time_zone
,但此时,最好继续使用 ICU 实现。请参阅此 Boost 常见问题解答。
当天很晚,但我一直在寻找类似的东西,所以这有望帮助其他人。使用 strftime 的以下(非增强)方式似乎适用于大多数平台:
time_t ts = 0;
struct tm t;
char buf[16];
::localtime_r(&ts, &t);
::strftime(buf, sizeof(buf), "%z", &t);
std::cout << "Current timezone: " << buf << std::endl;
::strftime(buf, sizeof(buf), "%Z", &t);
std::cout << "Current timezone: " << buf << std::endl;
或者可以将 std::time_put 用于纯 C++ 版本。
为了正确回答这个问题,重要的是要了解 Boost 中的时区支持受到严格限制。
它主要关注 POSIX 时区,它有几个限制。这些限制在时区标签 wiki的 POSIX 部分中进行了讨论,因此我不会在这里重复它们。
它具有使用 IANA/Olson 时区 ID 的函数,但它人为地将这些映射到 POSIX 值 - 这具有将时区扁平化为历史上的单个点的效果。这些映射存储在Boost 源代码中的 csv 文件中。
csv 文件自 2011 年 4 月以来一直没有更新,从那时起时区发生了许多变化。因此,它确实具有的映射有些不准确。
一般来说,我不建议使用 Boost 来处理时区。相反,请考虑ICU TimeZone Classes,它们是ICU项目的一部分。您会发现它们是完全可移植的,并且它们具有完整且正确的时区支持。
值得一提的是,ICU 被用于许多流行的应用程序中。例如,Google Chrome 网络浏览器从 ICU 获得时区支持。
在 ICU 中,当前本地系统时区可用作默认时区。您可以在 ICU 文档中的“工厂方法和默认时区”部分阅读更多信息。
好吧,也许你可以使用 GeoIP 库来做到这一点。我知道这有点矫枉过正,但由于世界上大多数计算机都连接到互联网,因此您可能会侥幸逃脱。据我正在为其开发的人说,它的准确率超过 99%。
注意:这是一个愚蠢的想法。我只是在寻找答案。
您总是可以尝试从 boost 中获取世界时间和当地时间并检查差异,但它可能充满了警告。