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);
}