C++
メモ

time_tの使い方でハマった

More than 1 year has passed since last update.


環境

Windows

VS2013

.DLLなプラグイン


内容


  • DLLであるプラグインを作成してとあるソフトに適用

  • 時間管理をしたりするのにtime_t使って現在時間とったときの問題があった。

  • PCのローカル時間とソフト内で通信してる基準時間が違う。

  • time_tを使うと1970年1月1日0時0分0秒から今使ってるPCのローカル時間までの総秒数を返してくる。

  • だけど使ってるアプリ内の時間GMT、試してる自分のPCは日本時間なので+9:00

  • そしてアプリ内でTimeZone設定する項目があり調整している


  • 時計合わない。死ぬ



対応したこと


  • time_tからtm構造体にgmtimeでして再度time_tに戻す


つまり

time_t localtime = time(nllptr);

struct tm *localT = gmtime(&localtime);

//訂正
//time_t greenwichTime = mktime(localT); Before
time_t greenwichTIme = _mkgmtime(localT); //After

的な感じで出来ました。

訂正内容

mktimeでtime_tに戻すと時間が強制的にLocalの時間になってる気がする(?)

例えばこんなことすると

time_t localtime = time(nllptr);

struct tm *localT = gmtime(&localtime);
//今日の0:00を取得したい
localT.tm_hour = 0;
localT.tm_min = 0;
localT.tm_sec = 0;

//time_tにもどす
time_t greenwichTime = mktime(localT);

的なことをした時に確認用にもう一度gmtimeでStructにして調べてみると

//例えばlocalTimeで取得した今日が2017/5/1 14:15:16 とかだったりすると

struct tm *reTime = gmtime(&greenwichTime);

//適当に出力
cout << reTime.tm_year + "/" + reTime.tm_mon + "/" + reTime.tm_mday + "/" + reTime.tm_hour + ":" + reTime.tm_min + ":" +reTime.tm_sec << endl;

で出てくるのは予測として2017/5/1 0:0:0だと思うんですが

実際は2017/5/1 14:0:0とか出力される

なんでかhourだけが0にならなかった。。

ので上記訂正の用に_mkgmtimeに変えたら0:0:0になりました。