web-dev-qa-db-ja.com

boost :: posix_time :: ptimeをtime_tに変換するにはどうすればよいですか?

何らかの「標準」の方法がありますか、それともgregorian::date(1970,1,1)から減算して直接計算するのが最善ですか?

41
ybungalobill

_time_t_は、秒単位の時間(通常はエポック時間)を保持するために使用されるタイプです。私はあなたがエポック時間の後にいると推測しています、もしそうなら、あなたがすでに持っている減算を除いて、実際にエポック時間を直接取得することのブーストの方法を認識していません。 _time_duration_(減算の結果)が得られたら、期間でtotal_seconds()を呼び出して、_time_t_に格納できます。

ところで。エポック時間を過ぎている場合は、gettimeofday()を使用するだけで頭痛を軽減できます。

14
Nim

@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に感​​謝します。 boost 1.58以降、この関数は_date_time/posix_time/conversion.hpp_、std::time_t to_time_t(ptime pt)に含まれています。

34
ybungalobill

念のため、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());
}
15
kgriffs

to_tm を使用してtmを取得し、 mktime を使用してtmからtime_tへ。

5
icecrime

これらの2行で実行する必要があります。

tm td_tm = to_tm(pt);
time_t tt = mktime(&td_tm);
2
Ramesh