1

これは今、かなりの間私を困惑させてきました。2 つの異なるサーバー間で ISO8601 でエンコードされた時間を送信できるようにする必要がある C++ で記述されたプログラムに取り組んでいます。ここでの主な支持者は Windows のようです。

これまでのところ、strptime()ネットワークから日付/時刻文字列を簡単に読み取ってtm*. ただし、ローカライズされたものに正しく変換することになると、私は完全に困惑するtm*ので、strftime(). 素朴なアプローチは単純に と の差を取ることですlocaltime(time(0))gmtime(time(0))、これは夏時間が含まれる任意の日付に対して一貫性がありません。

私がこれまでに取ってきたアプローチは、POSIX の日付と時刻の関数のみを使用し、必要に応じて Windows shim を作成することです (strptime()これまでは完了しており、timegm()必要に応じて今後も行う可能性があります)。私はそれを続けたいと思っていますが、単純な事実としてtm*、Windows の構造体には Linux や OSX にあるいくつかのフィールドがありません#if WIN32。また、これをブーストする必要がないことを本当に望んでいます。

4

1 に答える 1

1

与えられたstruct tm *utc_tmあなたはそれをtime_t utcusing(非ポータブル)に変えることができtimegm、それからそれをstruct tm *local_tmusingに変えることができますlocaltime

time_t utc = timegm(utc_tm);
struct tm local_tm;
localtime_r(&utc, &local_tm);

私の知る限り、最も単純な実装でtimegmは、月の表とうるう年の計算を使用して自分で変換を行う必要があります。または、正しく入力した場合は、 httpsstrptime//stackoverflow.com/a/9076848/567292tm_ydayの数式を使用できます。

tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 +
    (tm_year-70)*31536000 + ((tm_year-69)/4)*86400 -
    ((tm_year-1)/100)*86400 + ((tm_year+299)/400)*86400
于 2012-09-21T13:06:42.053 に答える