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 タイムゾーンであり、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おり/etc/localtime、最近の Linux システムでは Olson 識別子を含むシンボリック リンクであると見なされている と を調べます (履歴はこちら)。uprv_tzname実装の詳細については、を参照してください。

Boost は Olson 識別子の使い方を知りません。DST 以外のオフセットと DST オフセットを使用して を作成することもできますがposix_time_zone、現時点では、ICU 実装を使用し続けることをお勧めします。この Boost FAQを参照してください。

于 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;

または、純粋な C++ バージョンに std::time_put を使用できます。

于 2014-08-08T00:16:55.967 に答える
1

まあ、GeoIP ライブラリを使用してそれを行うことができるかもしれません。少しやり過ぎだとは思いますが、世界中のほとんどのコンピューターがインターネットに接続されているため、おそらく問題なく実行できます。私が開発している担当者によると、99% 以上の精度です。

注:これはばかげた考えです。私は答えを求めて伸びているだけです。

于 2010-01-26T22:49:52.007 に答える
1

この質問に適切に答えるには、Boost でのタイム ゾーンのサポートが大幅に制限されていることを理解することが重要です。

  • 主に、いくつかの制限がある POSIX タイム ゾーンに焦点を当てています。これらの制限については、タイムゾーン タグ wikiの POSIX セクションで説明されているため、ここでは繰り返しません。

  • IANA/Olson タイム ゾーンの ID で動作する関数がありますが、これらを人為的に POSIX 値にマッピングします。これにより、タイム ゾーンが履歴の単一ポイントにフラット化されます。これらのマッピングは、Boost ソース コードの csv ファイルに保存されます。

  • csv ファイルは 2011 年 4 月以降更新されておらず、それ以降、タイム ゾーンに多くの変更が加えられています。そのため、マッピング多少不正確です。

一般に、タイム ゾーンの操作に Boost を使用することはお勧めしません。代わりに、 ICUプロジェクトの一部であるICU TimeZone Classesを検討してください。これらは完全に移植可能であり、完全かつ正確なタイムゾーンをサポートしています。

ICU は多くの一般的なアプリケーションで使用されていることに注意してください。たとえば、Google Chrome Web ブラウザーは、ICU からタイム ゾーン サポートを取得します。

ICU では、現在のローカル システムのタイム ゾーンがデフォルトのタイム ゾーンとして使用できます。詳細については、ICU ドキュメントの「Factory Methods and the Default Timezone」セクションを参照してください。

于 2015-02-01T05:23:39.057 に答える
0

ブーストから世界時と現地時間を取得して違いを確認することはいつでもできますが、おそらく注意が必要です。

于 2011-09-28T21:37:02.933 に答える