2

boost::date_timeを使用して変換を実行する方法を理解するのに苦労しています。Unixエポック(00:00、1970年1月1日)から測定されたミリ秒の値を人間が読める文字列に変換したいのですが、次のようなもの2/13/2012 15:20:11が理想的です。

私はいくつかのstdC++ / Boostの提案を試しましたが、まだ運がありませんでした。私が使用するコードは次のとおりです。

    long long ticksFromEpoch = 1329117220501;

    std::time_t tt = static_cast<time_t>(ticksFromEpoch);

    boost::posix_time::ptime dt = boost::posix_time::from_time_t(tt);

    // Create a time_zone_ptr for the desired time zone and use it to create a local_date_time
    boost::local_time::time_zone_ptr zone(new boost::local_time::posix_time_zone("UTC"));
    boost::local_time::local_date_time dt_with_zone(dt, zone);

    std::stringstream strm;

    strm.imbue(std::locale(std::cout.getloc(), new boost::local_time::local_time_facet("%Y-%m-%d %H:%M:%S"))); // 15:14
    strm << dt_with_zone;

    // Print the stream's content to the console
    std::cout << strm.str() << std::endl;

出力は次のとおりです。2032-07-01 20:20:37これは明らかに正しくありません。変数を正しく作成していないのticksFromEpochではないかと思いますが、理由はわかりません。誰かが私を正しい方向に向けることができますか?どんな助けでも大歓迎です!!

4

1 に答える 1

7

time_t通常、ミリ秒ではなく、「エポック」からの秒数です。ミリ秒を気にしない場合は、次のことができるはずです。

std::time_t tt = static_cast<time_t>(ticksFromEpoch/1000)

ミリ秒を気にする場合は、最後にそれらを追加し直すことができます(12:00:00.001 AMのような時間に正しく設定するのは難しいです)。

または、別のルートに行く必要があります。次のようなものを使用する必要があるかもしれません:(未テスト)

boost::posix_time::ptime t2(
  boost::gregorian::date(1970,boost::date_time::Jan,1),  //The epoch
  boost::posix_time::seconds( ticksFromEpoch / 1000 ) + // Number of seconds
  boost::posix_time::milliseconds( ticksFromEpoch % 1000)  // And the micros too.
  );
于 2012-02-13T08:22:20.297 に答える