Windowsでは,API/ライブラリによって時間を表現するデータ構造がまちまちで,とても不便です。 そこで主にに使用されている次の3種類のデータを相互変換する関数を作成しました。
Windowsでは,API/ライブラリによって時間を表現するデータ構造がまちまちで,とても不便です。 そこで主にに使用されている次の3種類のデータを相互変換する関数を作成しました。
各データ形式によって精度・表現できる範囲が違っています。 ここで紹介するプログラムではオーバーフローなどのチェックは行っていませんので, その点は注意してください。
// time_t -> FILETIME 変換 FILETIME UnixTimeToFileTime(time_t t){ FILETIME ft; LONGLONG ll = Int32x32To64(t, 10000000) + 116444736000000000; ft.dwLowDateTime = (DWORD)ll; ft.dwHighDateTime = (DWORD)(ll >> 32); return ft; } // time_t -> SYSTEMTIME 変換 SYSTEMTIME UnixTimeToSystemTime(time_t t){ SYSTEMTIME st; FILETIME ft = UnixTimeToFileTime(t); ::FileTimeToSystemTime(&ft, &st); return st; } // FILETIME -> time_t 変換 time_t FileTimeToUnixTime(const FILETIME& ft){ LONGLONG ll; ll = ((LONGLONG)ft.dwHighDateTime << 32) + ft.dwLowDateTime; return (time_t)((ll - 116444736000000000) / 10000000); } // SYSTEMTIME -> time_t 変換 time_t SystemTimeToUnixTime(const SYSTEMTIME& st){ FILETIME ft; ::SystemTimeToFileTime(&st, &ft); return FileTimeToUnixTime(ft); }