6

localtime()を使用して、現地時間を表すtmを取得するセットアップがあります。そして、それはすべて良いことです。

ただし、アプリケーションの実行中にタイムゾーンを変更しても、タイムゾーンが変更されたことに気づきません。

システムのタイムゾーンに更新するために「もう一度確認する」ように指示する方法はありますか?

これはおそらく一般的なケースではないことはわかっていますが、この機能をテストするためにテストが行​​っていることなので、サポートを求めています。

4

2 に答える 2

4

見てくださいtzset(これはposixのみです)。これはあなたが必要なものを与えるかもしれません。TZ環境変数が設定されていない場合は、OSから再初期化する必要があります。

マニュアルページから:

説明

tzset()関数は、TZ環境変数からtzname変数を初期化します。この関数は、タイムゾーンに依存する他の時間変換関数によって自動的に呼び出されます。SysVのような環境では、変数timezone(GMTの西の秒数)とdaylight(このタイムゾーンに夏時間のルールがない場合は0、夏時間がある場合はゼロ以外)も設定されます。時間は適用されます)。

TZ変数が環境に表示されない場合、tzname変数は、システムのタイムゾーンディレクトリにあるtzfile(5)形式のファイルlocaltimeで指定されているように、ローカル実時間の最適な近似値で初期化されます(以下を参照)。(ここで使用されている/ etc / localtime、システムのタイムゾーンディレクトリ内の適切なファイルへのシンボリックリンクもよく見られます。)

簡単なテスト:

#include <iostream>
#include <time.h>
#include <stdlib.h>

int main()
{
        tzset();

        time_t t;
        time(&t);

        std::cout << "tz: " << tzname[0] << " - " << tzname[1] << " " << ctime(&t) << std::endl;

        setenv("TZ", "EST5EDT", 1);
        tzset();

        std::cout << "tz: " << tzname[0] << " - " << tzname[1] << " " << ctime(&t) << std::endl;

        return 0;
}

私に出力を与えます:

tz:CST-CDT Wed Jan 11 12:35:02 2012

tz:EST-EDT Wed Jan 11 13:35:02 2012

于 2012-01-11T18:38:25.527 に答える
1

これを行うための標準ライブラリには何もありません。プラットフォームがタイムゾーンを更新するためのライブラリの拡張機能を提供していない限り、プログラムの呼び出しでlocaltime()は、プログラムの起動時にアクティブだったタイムゾーンが常に使用される可能性があります。

localtimeメインプログラムが自由に起動およびシャットダウンできる別のプロセスにデータを配置して、そのプロセスのタイムゾーンを再初期化することで、おそらくこれを回避できます。

または、代わりに、プラットフォームが、システムタイムゾーンの変更を反映する現地時間を取得するための他のAPIを提供する場合があります。

于 2012-01-11T18:04:58.787 に答える