44

「標準的な」方法はありますか、または私ができる最善の方法は、から減算して直接計算することgregorian::date(1970,1,1)ですか?

4

5 に答える 5

37

@icecrime のメソッドは 2 回変換するため (ptime は内部で線形表現を使用します)、代わりに直接計算を使用することにしました。ここにあります:

time_t to_time_t(boost::posix_time::ptime t)
{
    using namespace boost::posix_time;
    ptime epoch(boost::gregorian::date(1970,1,1));
    time_duration::sec_type x = (t - epoch).total_seconds();

    // ... check overflow here ...

    return time_t(x);
}

編集:これを私の注意を引いてくれてありがとう@jaaw。ブースト 1.58 以降、この機能は に含まれていdate_time/posix_time/conversion.hppますstd::time_t to_time_t(ptime pt)

于 2010-12-16T15:18:46.233 に答える
16

time_t時間を秒単位で保持するために使用される型です (通常はエポック時間)。私はあなたがエポック時間を過ぎていると推測しています。そうであれば、あなたがすでに持っている減算を除いて、実際にエポック時間を直接取得する方法を知りません。time_duration(減算の結果) が得られたら、期間を呼び出してtotal_seconds()、それを に格納できますtime_t

ところで。エポックタイムを過ぎている場合は、簡単に使用gettimeofday()して頭痛を軽減できます!

于 2010-12-16T14:26:56.167 に答える
15

念のため、2038年を過ぎてしまう@ybungalobillの方法のバリエーションを次に示します。:)

int64_t rax::ToPosix64(const boost::posix_time::ptime& pt)
{
  using namespace boost::posix_time;
  static ptime epoch(boost::gregorian::date(1970, 1, 1));
  time_duration diff(pt - epoch);
  return (diff.ticks() / diff.ticks_per_second());
}
于 2011-07-27T19:05:59.017 に答える
5

あなたができる最善のことは、 を使用to_tmして を取得し、tmmktimeに変換するtmことだと思いますtime_t

于 2010-12-16T14:24:38.153 に答える
2

これらの2行でそれを行う必要があります。

tm td_tm = to_tm(pt);
time_t tt = mktime(&td_tm);
于 2012-04-26T21:47:40.807 に答える