2012-01-11 28 views
2

localtime()を使用して設定されたローカルタイムを持つtmを取得するセットアップがあります。そして、それはすべて良いです。C++タイムゾーンを変更するときのlocaltime

ただし、アプリケーションの実行中にタイムゾーンを変更すると、タイムゾーンが変更されたことがわかりません。

システムタイムゾーンをリフレッシュするために「もう一度見に行く」と言う方法がありますか?

これはおそらく一般的なケースではありませんが、この機能をテストするためにテストが行​​っているので、サポートしたいと考えています。

答えて

1

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

localtimeを別のプロセスに入れて、メインプログラムが起動してシャットダウンできるようにして、そのプロセスのタイムゾーンを再初期化できる可能性があります。

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

+0

私は恐れていました(または、おそらく望みました!)それはそういうものでしょう。私たちは後でクロスプラットフォームになることを期待しているので、Posixのソリューションは良くありません。「タイムゾーンを変更した場合は、サービスを再起動してください」というメッセージが表示されます。 – Jon

1

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

manページから:

説明

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

TZ変数が環境に表示されない場合は、TZNAME変数がローカル 壁時計時間の最良の近似で初期化され、システムのタイムゾーンディレクトリにあるtzfileで指定された(5)-formatファイルlocaltimeの (下記参照)。 (1つはまた、多くの場合、 は、/ 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水1月11日12時35分〇二秒2012

TZ:EST - EDT水1月11日夜01時35分02秒2012

+0

残念なことに、私たちはクロスプラットフォームになることを願っています。したがって、posixソリューションはそれをカットしません。しかし、ありがとう! – Jon