time関係の関数について…
time_t型、およびtm型を使った日付クラスを作ったときに、色々混乱したので
そこらへんについて少々。
【time_t型】
1970年1月1日午前0時からの経過秒数。
世界協定時刻 (UTC)基準、(ロンドンのグリニッジ天文台)なので、日本国内での
時間として使う場合は時差(9時間)を考慮しなければならない。
「なんか9時間ずれるんだよなぁ~」みたいな怪奇現象がおこったら
時差を疑ってみるといい、っていうか疑うしかない。
【tm型】
時間を年月日時分秒で扱うことができる。基本的にtime_t型と組み合わせて使う。
time_t ⇔ tm というコンバートを行う関数が用意されているので、それを使う。
【関数】
- time()
- 現在の時刻をUTCで取得
- localtime_s()
- time_tからローカル時刻でのtm型を取得。
この関数でtm型を取得してから時刻を取得するのが一般的な流れか
- gmtime_s()
- time_tからUTCのままでtm型を取得する。
- mktime()
- ローカル時刻のtm型からUTCでのtime_t型を取得する。
同時にtm型の正規化(設定されていないメンバに値をセット)する。
【備考】
localtime_s() ⇒ mktime()だとtime_tは元に戻る。
gmtime_s() ⇒ mktime()だと時差の分だけずれる。
【注意】
例えば時間を2時間単位でまるめこもうとして、
time_t cur_time;
cur_time = cur_time - (cur_time % (60*60*2))
とやっても上手くいかない。
…というのも、まるめこまれているのはあくまでUTC基準時刻なので、時差を考慮すると9時間の
ずれが生じてしまうので、その時点でずれてしまう。
よって丸め込むのであればローカル時刻にしてからでないと駄目。
最終更新:2009年01月13日 20:10