7

簡潔な方法、またはaからaに変換し、また元に戻す一般的に受け入れられている方法はboost::posix_time::ptimeありmongo::Date_tますか?

ブーストするMongo

Boostのドキュメントが不完全または正しくないようです。から構造体date_from_tmを構築する関数を文書化します。ただし、次の例が示されています。datetm

tm pt_tm;
/* snip */
ptime pt = ptime_from_tm(pt_tm);

しかし、文書化された機能はありませんptime_from_tm。ただし、このヘッダーファイルにはその機能 が含まれています。

だから、私は少なくともからmongo::Date_tに行くことができますboost::posix_time::ptime

mongo::Date_t d = ...;
std::tm t;
d.toTm(&t);
boost::posix_time::ptime pt = ptime_from_tm(t);

Mongoにブースト

反対方向に行くことになると、私はちょっと立ち往生しています。MongoDBのドキュメントはかなり不完全であり、関連するヘッダーファイルには多くの役立つコメントがありません。基本的に、Date_t構造体はunsigned long longミリ秒カウントから構成されます。私は1970-1-1:00:00.00エポックからしか推測できません。

したがって、aからaに移行するための現在の解決策boost::posix_time::ptimeは次のmongo::Date_tとおりです。

boost::posix_time::ptime pt = ...;
std::tm pt_tm = boost::posix_time::to_tm(pt);
std::time_t t = mktime(pt_tm);
mongo::Date_t d(t);

もちろん、それを1行にまとめることはできますが、ある日付/時刻の表現から別の表現への往復全体が複雑で厄介になっているようです。

ついに

もっと良い方法はありますか?両方のライブラリについての知識があり、日付/時刻プログラミングについてよく理解している人は、私が達成しようとしていることを達成するための簡潔で簡単な方法を知っていますか?

4

2 に答える 2

3

ptimeからDate_tへのソリューションの変換に問題があるようです。コメントしたとおり、試してみると間違った結果が得られます。私にはもっと良い方法があります:

mongo::Date_t convert(const boost::posix_time::ptime& time)
{
    boost::posix_time::ptime epoch(boost::gregorian::date(1970,boost::date_time::Jan,1));
    boost::posix_time::time_duration d = time - epoch;
    return mongo::Date_t(d.total_milliseconds());
}
boost::posix_time::ptime convert(const mongo::Date_t& time)
{
    boost::posix_time::ptime epoch(boost::gregorian::date(1970,boost::date_time::Jan,1));
    boost::posix_time::time_duration d = boost::posix_time::milliseconds(time.millis);//- epoch;
    return boost::posix_time::ptime(epoch+d);
}

2.4.3(私が知っているように)Date_t :: toString()にはバグがあり、「date」が8時間追加されていることに注意してください。ここで「合計ミリ秒」を確認できます

于 2013-05-23T08:35:40.287 に答える
2

基本的に、Date_t構造体は、unsignedlonglongミリ秒カウントから構築されます。私は1970-1-1:00:00.00エポックからしか推測できません。

あなたは正しいです。

私はあなたのコードがあなたが得ようとしているのとほぼ同じくらい良いと思います。どういうわけか、エポックからtime_tのような秒数に到達する必要があります。これは、ptimeとは少し複雑なようです。

于 2012-06-13T15:39:41.237 に答える