2007年11月27日

Windowsでtime_tみたいな値を扱う

最近あまり使ってませんが、ANSI-Cの規格に時間を扱うtime_tという型があります。
猫でもわかるプログラミング - 第26章
このtime_tは、tm構造体に変換して使うことが多いのですが、time_tは単位が秒であるため、3600加算すれば「一時間先」に進むことが出来ます。
これだけだと「はぁ?」と思われそうですが、ずいぶん楽できます。
tm構造体で時間の値を操作すると、繰り上がりと繰り下がりを自分で管理する必要が出てきます。
マイナス1時(前日の23時)や、24時(翌日AMゼロ時)になった場合、日にちを操作する必要があります。
それが1日や月末をまたいだら月を操作しなければいけません。
さらに1月もしくは12月をまたいだら・・・。
もちろんこれは「分」「秒」の単位にも必要です。
それが数値の足し引きで済むわけです。
ということを最近気づきました。
# プログラミング始めた1年目に「面倒だなー」と思っていたんですが・・・今10年超orz
そんな便利なtime_t。Windowsだと相当するデータ(日付日時を示す一意の値)はありません。
標準Cライブラリがあるのでtime_tをはじめ、localtime関数も使えます。
しかし、標準Cライブラリを外してプログラミングをしたい変態さんもいます。
Microsoftもそのあたり少し解っているのかヒントを出していました。
Win32 FILETIME または SYSTEMTIME に UNIX time_t を変換する方法
UnixTimeをSYSTEMTIMEやFILETIMEに変換する方法だそうで。この逆をすればよい、ということでやってみました。
が、微妙に時間がすれる。時間だけで「分」「秒」はズレてない。
逆に計算する方法がまずい?
てことでMS情報以外のソース。
CocoaDev: ConvertNSDateToWIndowsFILETIME
FILETIMEに情報を入れる場合、上位を先に入れてシフトさせると良いらしい。
これで翌月1日マイナス1日で月末が何日なのか取得できます;-)

0 件のコメント: