タイムゾーンオフセット
タイムゾーンオフセットを取得しようとして詰まりました。
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, >); ptime g = ptime_from_tm(gt); std::tm lt; ::localtime_r(&t, <); ptime l = ptime_from_tm(lt); return (g - l).total_seconds(); }
などの方法を取ることになります。
一応、これでオフセットは計算できるわけですが、問題はこうやってタイムゾーンオフセットを取得できたとしてもローカル時刻を取得した時点と同じタイムゾーンである保証はないことです。
ライブラリ側ではライブラリユーザーが別スレッドでタイムゾーンを変更することを防げないので、タイムゾーンとローカル時刻の同期はライブラリユーザーにやってもらうほかありません。
やはり、タイムゾーン周りはHamigaki.Archiversから外したほうがよさそうです。