タイムゾーンオフセット

タイムゾーンオフセットを取得しようとして詰まりました。
POSIXならtimezone、Windowsなら_timezoneを見れば済むと思っていたのですが、このグローバル変数はtzset()やlocaltime()などを呼ぶまで設定されないようになっています。
それでもシングルスレッド環境であれば、

// シングルスレッド(POSIX)版
long timezone_offset_seconds()
{
    ::tzset();
    return timezone;
}

で済みます。
マルチスレッド環境になると、グローバル変数に依存できないので、

// マルチスレッドスレッド(POSIX)版
long timezone_offset_seconds()
{
    using namespace boost::posix_time;

    std::time_t t = 0;

    std::tm gt;
    ::gmtime_r(&t, &gt);
    ptime g = ptime_from_tm(gt);

    std::tm lt;
    ::localtime_r(&t, &lt);
    ptime l = ptime_from_tm(lt);

    return (g - l).total_seconds();
}

などの方法を取ることになります。


一応、これでオフセットは計算できるわけですが、問題はこうやってタイムゾーンオフセットを取得できたとしてもローカル時刻を取得した時点と同じタイムゾーンである保証はないことです。
ライブラリ側ではライブラリユーザーが別スレッドでタイムゾーンを変更することを防げないので、タイムゾーンとローカル時刻の同期はライブラリユーザーにやってもらうほかありません。
やはり、タイムゾーン周りはHamigaki.Archiversから外したほうがよさそうです。