2012-05-10 18 views
7

tm構造体のtm_isdstフラグの使い方に疑問があります。マニュアルページと結果をグーグルのとおり、私は、その値がmktimeとtm_isdstフラグ

A.を次のように0の値は、DSTが示さ時間

Bに対して有効でないことを示す1の値は、DSTがあることを示すと解釈されることを理解します実際には

C.値が-1の場合、mktimeはDSTが有効かどうかをチェックします。

私を混乱させるこの第3のポイントです。私の疑いは、mktimeがDSTを適用するかどうかを正確に把握するかどうかです。時間の経過とともに例えば

My Time Zone = GMT + 3:00 
DST shifting = +1 Hour at 5:00 AM in January (to keep it simple) 
Current UTC time = "01/Jan/2012 00:00:00" 
UTC time in seconds time_t timetUTC = X seconds 
Hence my time is = "01/Jan/2012 03:00:00" 

は、私の理解

tm tmMyTime = localtime_r(X + 2 * 60 * 60) will set tmMyTime.tm_isdst to 0 
tm tmMyTime = localtime_r(X + 3 * 60 * 60) will set tmMyTime.tm_isdst to 1 

この方法を1として

"01/Jan/2012 04:00:00"   (X + 1 * 60 * 60) 
"01/Jan/2012 05:00:00"   (X + 2 * 60 * 60) 
"01/Jan/2012 05:59:59"   (X + 2 * 60 * 60 + 59) 
"01/Jan/2012 05:00:00"   (X + 3 * 60 * 60) 
"01/Jan/2012 06:00:00"   (X + 4 * 60 * 60) 

を私の時間値の変化を次のようにしても、他のすべてのコンポーネントかかわらずtm構造はどちらの場合も同じです mktime(tmMyTime)はpを返すことができますtm_isdstの値に応じて、ローパーのUTC値。

ここで、tmMyTime.tm_isdst = -1に設定すると、mktimeはどのような値を返しますか?私は、TZ変数、時間データベースなどについて読んでいます。それにもかかわらず、論理的には、mktime()はDST補正を適用するかどうかを2回発生するtm値に適用するかどうかを考えます。

私たちのタイムゾーンにはDSTがありません。したがって、私の理解が であるかどうかは分かりません。私が間違っていれば私を修正してください。あなたの助けが大変ありがとうございます。

+4

ローカル時間があいまいであることがわかりました。そうです。 –

答えて

4

要するに、実装に依存します。

mktimeは、ロケールを確認してDSTルールを認識します。

mktimeは、特定の現地時間にDSTを適用するかどうかを判断することができます。この問題は、DSTが後方にシフトする(実際の例では05:00:00 - 05:59:59)「重複した」時間です。 tm_isdst = -1を指定すると、mktimeはDSTが有効かどうかを知ることができません。これらのうちどれが選択されるかは、実装ごとに異なります。 mktimeのGNU版では、シフト前のUTCが返されます。

+1

ありがとうございます。最高でもmktimeはそれだけでも私が感じたものです。しかし、この曖昧な1時間の処理に関する明確な記述はどこにも(マニュアルページを含む)どこにもありませんでした。私は、 "tm = localtime_r(time_t)"の後に毎回コードベースでこのフラグを意図的に-1にリセットすることに気付くと、もっと混乱しました。少なくともこの場合、私はその旗をそのまま残すべきだと思った。また、実装ではこの動作をマニュアルページに明記する必要があります。標準関数は、常に正しい結果を与えるか、失敗した場合にエラーを投げるか、または少なくともマニュアルページの偏差に言及する必要があります。 – mpathi

+0

良い答え。ここで問題となるのは、すべてのユーザが私たちを渡して 'struct tm'に似たもので、タイムゾーン情報への私たちの唯一のインタフェースがPosix' mktime() 'である場合、私たちは移植可能に問題の周りをコードすることができないということです。ユーザーが私たちに与えている「2013年11月3日1:30 AM」を指定するように強制することもできるし、 'tm_isdst = -1'を設定してベストを願うかもしれない。 –

1

私はそれがあなたのプラットフォームにいくらか依存していると思います。 Windowsでは、少なくとも、mktime()のドキュメントでは "Cランタイムライブラリは米国の夏時間計算の実装ルールを前提としている"ということを示しているため、DSTの開始/任意の年に終了しました。

DSTをしていないのは幸いです。私の世界では、リアルタイムのデータ収集とプレゼンテーションが行われますが、DSTは大きな迷惑です!

+0

返事をありがとう。しかし、mktime()がどのようにそれを行うことができるのかは依然として不明です。 2つのUTC time_t値は、ローカルタイムゾーンで同じtm値を持つことができるので(is_dstを除く)、このフラグを-1にリセットすると、論理的にmktime()関数はUTC値それを元に戻す。 – mpathi

1

tm_isdst一般的にあいまいな時間を解決することはできません。多くのタイムゾーンは、オフセットとゾーンの省略形を変更するだけでdstからnodstにジャンプせずにトランジション(1回限り)があるためです。そのため、両方の時間(遷移前後)には同じtm_isdstがあります。 夏/冬の時間を切り替えるときに、他のゾーンがtm_isdstに変更されますが、省略名(オーストラリア/メルボルンなど)は変更されません。

関連する問題