CTimeでの取得時間のずれ – プログラミング – Home

CTimeでの取得時間のずれ
 
通知
すべてクリア

[解決済] CTimeでの取得時間のずれ


DIO
 DIO
(@DIO)
ゲスト
結合: 18年前
投稿: 62
Topic starter  

こんにちは。
早速ですが質問です。

現在時間を取得しようと、

CTime tim;
tim = CTime::GetCurrentTime();
int hour = tim.GetHour();

とすると、
年、月、日、分、秒は正常なのに、時だけが1時間進んで取得されます。
(トレイの時刻よりきっかり1時間)

対処は出来るのですが(-1する)、
原因がわからないのでそれでいいのか不安です。

原因、怪しいとこなど教えていただけないでしょうか?

VS2005
OSはWinxp pro(日本語版)でタイムゾーンは東京になってます。

原因がわからないので、必要な情報もわかりません。
他に、必要な情報等があれば、指示してください。

よろしくお願いします。


引用未解決
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

同じ環境(WindowsXP Pro SP2/VS 2005 Pro)で上記のコードをデバッグモードで
ステップ実行してみましたが正しい値が取れているようでした。

ですので、新規プロジェクトで試してみてもその現象が発生するかちょっと試してみて
はどうでしょうか?


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

1時間進んでいるってのが夏時間くさい気がする。
タイムゾーン設定で夏時間を有効にしているのではないだろうかと妄想してみる
# 有効にしたつもりが無くても誤って有効になっているということ

現に環境変数TZ=JST-9DSTとして提示のプログラムを実行すると1時間ずれた


返信引用
DIO
 DIO
(@DIO)
ゲスト
結合: 18年前
投稿: 62
Topic starter  

返信ありがとうございます。

Blueさん
新規プロジェクトでやっても同様でした。
デバッグでもリリースでも同様です。

terapodさん
なるほど、そんな感じはしますね。
心当たりはないですが(;´▽`A~~

しかし、
システム環境変数に”TZ=JST-9”
を追加してリブートしても変化なしでした。

申し訳ありませんが、
詳しい設定方法を教えていただけないでしょうか?


返信引用
c
 c
(@c)
ゲスト
結合: 22年前
投稿: 9
 

「日付と時刻」の「タイムゾーン」を一時的に別の地域に設定し、
元に戻したら直るかも。

↓こういうこともあるらしいから。
http://service1.symantec.com/support/inter/ent-gate-jp.nsf/jp_docid/20031201160755962?OpenDocument&dtype=corp


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

本当に夏時間補正が起きてるかどうかは大域変数 daylight の値が0かどうかで
判断できる。だから CTime::GetHour() の直前にでも
daylight (POSIX 標準変数だから VC++ の解説では _daylight になってる) を
検査してみるといい。


返信引用
DIO
 DIO
(@DIO)
ゲスト
結合: 18年前
投稿: 62
Topic starter  

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ぐらいです。
結局原因は?です。

一応、解決ずみにしますが、
もし良かったら引き続き原因究明にお付き合いください。

ありがとうございました。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

daylight=1 になるのは GetTimeZoneInformation で得られる
・DaylightDate に値が入っていて
・DaylightBias が非0な場合なので
(CRT ソースコードをインストールして CRT/SRC/TZST.C を読みましょう)
やはり夏時間が有効になっているのは間違いないです。

んで、問題となっているプログラムとは別に新規に小さなテストプログラムを
組んでみてください。コンソールアプリがいいです。
GetTimeZoneInformation の返す DaylightDate を確認しましょう。
テストプログラムで DaylightDate が 0 (夏時間補正なし) が確認できるか?
もしそうなら、当該 (誤動作する) プログラムのどこかで誤った値を指定した
SetTimeZoneInformation してるのでしょう

手動で daylight=0; にするのは邪道/というより間違いなので、
バータリー的に直さず原因を追求してください。
# 場当たり的に直したら別の形でバグが再現するでしょうから


返信引用
DIO
 DIO
(@DIO)
ゲスト
結合: 18年前
投稿: 62
Topic starter  

昨日はなぜか投稿できず、
返信が遅くなってすいません。

新規プロジェクトに
エディットボックスと、ボタンだけ配置して以下のコードを実行しました。

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の問題でしょうか?


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

なぜ、DaylightDateの全ての要素を確認していないのでしょう?
wMonthは?

tetrapodさんのレスポンスに従ってCRT/SRC/TZST.Cを見てみましたか?

wMonthが0でなく、DaylightBiasが0で無いならやはり
daylightは1になると思いますよ。

しっかし狙ったようにwMonthだけを外すと言うのも・・・。


返信引用
DIO
 DIO
(@DIO)
ゲスト
結合: 18年前
投稿: 62
Topic starter  

>PATIOさん

うわぁ~最悪。
デバッガで見たときはすべてゼロだったと記憶していますが、
連休明けにすぐ確認します。

決して冗談ではありません。
すいませんでした。


返信引用
DIO
 DIO
(@DIO)
ゲスト
結合: 18年前
投稿: 62
Topic starter  

返信遅くなりました。

DaylightDate.wMonth = 0

を確認しました。

直接取得は0なのでOSは0で
新規プロジェクトでもダメということは、

どっか設定イジったっけなぁ?

原因推測できますでしょうか?


返信引用
v
 v
(@v)
ゲスト
結合: 18年前
投稿: 1
 

http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=336439&SiteID=7
これ、関係あります?


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました