2017-09-16 15 views
0

私は現在のシステム時間にアクセスするためにTimeオブジェクトが必要なC++でアプリケーションを構築しています。これを行うには、time.hを使用します。ユニットテストをするとき時間の変更に失敗したため、struct tm 'tm_isdst'フラグを使用する正しい方法ですか?

Time::Time(bool p_daylightSavingEnabled /* = true */) 
{ 
    time_t rawTime = time(nullptr); 
    struct tm* timeInfo = localtime(&rawTime); 

    timeInfo->tm_isdst = static_cast<int>(p_daylightSavingEnabled); 

    m_hours = timeInfo->tm_hour; 
    m_minutes = timeInfo->tm_min; 
    m_seconds = timeInfo->tm_sec; 
} 

すべては私が追加tm_isdstフラグの使用を除き、かなり単純ですが、それでも私に神秘的である:私の2つのコンストラクタは次のように行きます。インターネット上でこのフラグを正しく使用する方法についての明確な文書は見つかっておらず、一部のシステムでは利用できない(つまり0に設定されている)と聞いています。

tm_isdstを使用する正しい方法ですか、そうでない場合は(たとえばコンストラクタなどで)異なるシステム間で正しく動作させるにはどうすればよいですか?

説明:今のところ、私はtime.hの代替案に興味はありません。

+1

いいえ。 'localtime'が返すものを見てください。補償的な変更を加えることなく無視したり上書きしたりすることはできません。そして、はい、それは一般的にあまり定義されていません。 –

+0

@JonathanLeffler *あなたはそれが無視され/より多くの補償的な変更なしでオーバーライドされることはできないふりをしてはいけません。私が見ることができる例がありますか? – BobMorane

+0

'localtime'のマニュアルページは' is_dst'の意味を完全に説明しています。 'localtime'のマニュアルページにそのフィールドの記述が不明な場合は、あなたには正確に何が分からないのかを説明する必要があります。 –

答えて

0

あなたのコードは、単純に次のようになります。

Time::Time() 
{ 
    time_t rawTime = time(nullptr); 
    struct tm* timeInfo = localtime(&rawTime); 

    m_hours = timeInfo->tm_hour; 
    m_minutes = timeInfo->tm_min; 
    m_seconds = timeInfo->tm_sec; 
} 

それは「今」DSTがオンまたはオフであるかどうかを機械に伝えるためにあなたを必要としないで何時間見つけ出します。それはすでに知っている。

P .:コードはスレッドセーフではありません。代わりにlocaltime_r()を使用してください。

+0

@johnswinck私が正しく理解していれば、私はDSTフラグを扱わず、私のシステムが夏時間をサポートしていれば、時間を変更する(そして変更する)ときにそれ自体を知るべきですか?言い換えれば、DSTフラグは、システムが夏時間をサポートしているかどうかをプログラマに通知するためだけにあります。 – BobMorane

+1

DSTフラグは、システムが現在DSTに入っているかどうかを通知するためのものです。システムは、DSTの時刻をいつ変更するかを自ら知っています。 –

関連する問題