1

この質問は他の場所で回答されていると確信していますが、GoogleやSOで見つけることができないので、ここに行きます.

C/C++ で、相対時間を dd-hh:mm:ss 形式で変換したい

ps -o etime

絶対 UTC 形式の日付に。

これはそれほど難しいことではないようです。struct tm 形式で格納された相対時間を生成する関数を既に取得しているとします。

struct tm *starting_rel_time = my_reltime_converstion(...);
time_t t = time(0);
struct tm *current_abs_time =  localtime(&t);

私が欲しいのは基本的にdifftimeの反対です:

struct *tm starting_abs_time = current_abs_time - starting_rel_time;

これで、変換を行う独自の関数を作成できますが、すべてのキャリー操作と特別な条件 (閏年など) のために悪夢です。C/C++ ライブラリでこれを行う方法はありますか?

4

4 に答える 4

3

Boost::Date_Timeライブラリを使用します。

于 2012-09-24T13:37:21.393 に答える
2

DD-HH:MM::SS簡単な計算で秒に変換します。相対時間なので、乗算して加算するだけです。次に、current time()秒単位でクエリを実行し(「現在と比較して」と想定)、それらを追加します。次に、を使用gmtimeしてに変換し直しstruct tmます。

于 2012-09-24T13:43:58.717 に答える
1

C /C++のような言語はありません。

Cについて質問する場合は、日付を単純な数値タイプで内部的に表現し、struct tm必要な場合にのみ変換することをお勧めします。数十年しかカバーする必要がない場合はtime_t、標準関数gmtimemktimeライブラリ関数を使用して変換することができます。より広い期間をカバーするために、ユリウス日表現を使用できます。

C ++について質問している場合は、Boost.Date_Timeライブラリをお勧めします。もちろん、Cライブラリ関数は、ニーズに合っていれば引き続き使用できます。

于 2012-09-24T13:45:06.310 に答える
0

あなたがやろうとしていることは意味がありません。2つの日付を追加することはできません。(そしてdifftime、日付も返しませんtime_t。)

実際には、すべてではないにしても、ほとんどの実装は、time_t特定の「エポック」以降の秒数を持つ整数型になります。time_tこのようなマシンでは、少なくとも、関心のあるすべての時間がサポートされている間隔time_t(ほとんどのUnixプラットフォームでは1970年から2038年の間)にある場合は、 aから整数秒を加算または減算して、新しい時刻を取得できます。 )。これは、とともに、gmtimeおそらく あなたのニーズmktimelocaltimeは十分です。特に、入力mktimeを「修正」するために必要であることに注意してくださいtm。たとえば、tmフィールドに5を追加し、それをtm_mday呼び出す ことができます。mktimemktime

これが十分でない場合、C ++ 11にはaとクラスの両方がありtime_pointduration(一見すると)必要になる可能性のあるすべての機能を備えているようです。

于 2012-09-24T14:28:13.420 に答える