こんにちは。
早速ですが質問です。
現在時間を取得しようと、
CTime tim;
tim = CTime::GetCurrentTime();
int hour = tim.GetHour();
とすると、
年、月、日、分、秒は正常なのに、時だけが1時間進んで取得されます。
(トレイの時刻よりきっかり1時間)
対処は出来るのですが(-1する)、
原因がわからないのでそれでいいのか不安です。
原因、怪しいとこなど教えていただけないでしょうか?
VS2005
OSはWinxp pro(日本語版)でタイムゾーンは東京になってます。
原因がわからないので、必要な情報もわかりません。
他に、必要な情報等があれば、指示してください。
よろしくお願いします。
同じ環境(WindowsXP Pro SP2/VS 2005 Pro)で上記のコードをデバッグモードで
ステップ実行してみましたが正しい値が取れているようでした。
ですので、新規プロジェクトで試してみてもその現象が発生するかちょっと試してみて
はどうでしょうか?
1時間進んでいるってのが夏時間くさい気がする。
タイムゾーン設定で夏時間を有効にしているのではないだろうかと妄想してみる
# 有効にしたつもりが無くても誤って有効になっているということ
現に環境変数TZ=JST-9DSTとして提示のプログラムを実行すると1時間ずれた
返信ありがとうございます。
Blueさん
新規プロジェクトでやっても同様でした。
デバッグでもリリースでも同様です。
terapodさん
なるほど、そんな感じはしますね。
心当たりはないですが(;´▽`A~~
しかし、
システム環境変数に”TZ=JST-9”
を追加してリブートしても変化なしでした。
申し訳ありませんが、
詳しい設定方法を教えていただけないでしょうか?
「日付と時刻」の「タイムゾーン」を一時的に別の地域に設定し、
元に戻したら直るかも。
↓こういうこともあるらしいから。
http://service1.symantec.com/support/inter/ent-gate-jp.nsf/jp_docid/20031201160755962?OpenDocument&dtype=corp
本当に夏時間補正が起きてるかどうかは大域変数 daylight の値が0かどうかで
判断できる。だから CTime::GetHour() の直前にでも
daylight (POSIX 標準変数だから VC++ の解説では _daylight になってる) を
検査してみるといい。
cさん
だめでしたぁ。
サマータイムある国にしてチェックはずしてほぞんし、
それからもどしてもダメでした
terapodさん
_daylightの値は直前で1でした。
CTime tim;
tim = CTime::GetCurrentTime();
_daylight = 0;
tim.GetHour();
とすることで正常に動作しました。
そこで、レジストリの
\\HK...\SYSTEM\CurrentControlSystem\Contorol\TimeZoneInformation\
の中を見て、
DisableAutoDayLight?(うろおぼえ)という値が1になっていたので、
それを0にしたのですが変わらず、
ほかは、0か0xffffde4で、
cさんのリンクのようなDayLightStart等の変化もありませんでした。
時計関係で使ってるのは、Tclockぐらいです。
結局原因は?です。
一応、解決ずみにしますが、
もし良かったら引き続き原因究明にお付き合いください。
ありがとうございました。
daylight=1 になるのは GetTimeZoneInformation で得られる
・DaylightDate に値が入っていて
・DaylightBias が非0な場合なので
(CRT ソースコードをインストールして CRT/SRC/TZST.C を読みましょう)
やはり夏時間が有効になっているのは間違いないです。
んで、問題となっているプログラムとは別に新規に小さなテストプログラムを
組んでみてください。コンソールアプリがいいです。
GetTimeZoneInformation の返す DaylightDate を確認しましょう。
テストプログラムで DaylightDate が 0 (夏時間補正なし) が確認できるか?
もしそうなら、当該 (誤動作する) プログラムのどこかで誤った値を指定した
SetTimeZoneInformation してるのでしょう
手動で daylight=0; にするのは邪道/というより間違いなので、
バータリー的に直さず原因を追求してください。
# 場当たり的に直したら別の形でバグが再現するでしょうから
昨日はなぜか投稿できず、
返信が遅くなってすいません。
新規プロジェクトに
エディットボックスと、ボタンだけ配置して以下のコードを実行しました。
CString str;
char buf[1000];
_TIME_ZONE_INFORMATION Tim;
GetTimeZoneInformation(&Tim);
sprintf_s( buf ,sizeof(buf) ,DaylightDate.wDay =
%hd\r\n,Tim.DaylightDate.wDay);str += buf;
sprintf_s( buf ,sizeof(buf) ,DaylightDate.wDayOfWeek =
%hd\r\n,Tim.DaylightDate.wDayOfWeek );str += buf;
sprintf_s( buf ,sizeof(buf) ,DaylightDate.wHour =
%hd\r\n,Tim.DaylightDate.wHour );str += buf;
sprintf_s( buf ,sizeof(buf) ,DaylightDate.wMilliseconds =
%hd\r\n,Tim.DaylightDate.wMilliseconds );str += buf;
sprintf_s( buf ,sizeof(buf) ,DaylightDate.wMinute =
%hd\r\n,Tim.DaylightDate.wMinute );str += buf;
sprintf_s( buf ,sizeof(buf) ,DaylightDate.wSecound =
%hd\r\n,Tim.DaylightDate.wSecond );str += buf;
sprintf_s( buf ,sizeof(buf) ,DaylightDate.wYear =
%hd\r\n,Tim.DaylightDate.wYear ); str += buf;str += \r\n\r\n;
CTime tim;
tim = CTime::GetCurrentTime();
str += tim.Format(%Y-%m-%d %H:%M:%S );
edit1.SetWindowText(str);
結果は以下の通りです。
DaylightDate.wDay = 0
DaylightDate.wDayOfWeek = 0
DaylightDate.wHour = 0
DaylightDate.wMilliseconds = 0
DaylightDate.wMinute = 0
DaylightDate.wSecound = 0
DaylightDate.wYear = 0
2006-10-04 20:29:15
time_t でやっても1時間進んでました。
でも、DaylightDateは0です。
ということは?VSの問題でしょうか?
なぜ、DaylightDateの全ての要素を確認していないのでしょう?
wMonthは?
tetrapodさんのレスポンスに従ってCRT/SRC/TZST.Cを見てみましたか?
wMonthが0でなく、DaylightBiasが0で無いならやはり
daylightは1になると思いますよ。
しっかし狙ったようにwMonthだけを外すと言うのも・・・。
>PATIOさん
うわぁ~最悪。
デバッガで見たときはすべてゼロだったと記憶していますが、
連休明けにすぐ確認します。
決して冗談ではありません。
すいませんでした。
返信遅くなりました。
DaylightDate.wMonth = 0
を確認しました。
直接取得は0なのでOSは0で
新規プロジェクトでもダメということは、
どっか設定イジったっけなぁ?
原因推測できますでしょうか?