Windows時間データの相互変換

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