28

在我见过的大多数例子中:

time_zone_ptr zone( new posix_time_zone("MST-07") ); 

但我只想获取运行代码的机器的当前时区。我不想硬编码时区名称。

4

5 回答 5

10

普通 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 兼容并查看TZand /etc/localtime,在最近的 Linux 系统上,它被指定为包含 Olson 标识符的符号链接(这里是历史记录)。见uprv_tzname实施细节。

Boost 不知道如何使用 Olson 标识符。您可以使用非 DST 和 DST 偏移量构建一个posix_time_zone,但此时,最好继续使用 ICU 实现。请参阅此 Boost 常见问题解答

于 2010-01-27T23:18:27.203 回答
4

当天很晚,但我一直在寻找类似的东西,所以这有望帮助其他人。使用 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++ 版本。

于 2014-08-08T00:16:55.967 回答
1

为了正确回答这个问题,重要的是要了解 Boost 中的时区支持受到严格限制。

  • 它主要关注 POSIX 时区,它有几个限制。这些限制在时区标签 wiki的 POSIX 部分中进行了讨论,因此我不会在这里重复它们。

  • 它具有使用 IANA/Olson 时区 ID 的函数,但它人为地将这些映射到 POSIX 值 - 这具有将时区扁平化为历史上的单个点的效果。这些映射存储在Boost 源代码中的 csv 文件中。

  • csv 文件自 2011 年 4 月以来一直没有更新,从那时起时区发生了许多变化。因此,它确实具有的映射有些不准确。

一般来说,我不建议使用 Boost 来处理时区。相反,请考虑ICU TimeZone Classes,它们是ICU项目的一部分。您会发现它们是完全可移植的,并且它们具有完整且正确的时区支持。

值得一提的是,ICU 被用于许多流行的应用程序中。例如,Google Chrome 网络浏览器从 ICU 获得时区支持。

在 ICU 中,当前本地系统时区可用作默认时区。您可以在 ICU 文档中的“工厂方法和默认时区”部分阅读更多信息。

于 2015-02-01T05:23:39.057 回答
1

好吧,也许你可以使用 GeoIP 库来做到这一点。我知道这有点矫枉过正,但由于世界上大多数计算机都连接到互联网,因此您可能会侥幸逃脱。据我正在为其开发的人说,它的准确率超过 99%。

注意:这是一个愚蠢的想法。我只是在寻找答案。

于 2010-01-26T22:49:52.007 回答
0

您总是可以尝试从 boost 中获取世界时间和当地时间并检查差异,但它可能充满了警告。

于 2011-09-28T21:37:02.933 回答