14

私は時間を使って多くの計算を行っており、秒を追加することで他の時間オブジェクトに相対的な時間オブジェクトを構築しています。コードは、組み込みデバイスとサーバーで実行されることになっています。ほとんどのドキュメンテーションはtime_t、それが何らかの算術型であり、通常はエポックからの時間を格納していると述べています。time_t何かからの秒数を保存すると仮定するのはどれほど安全ですか? それを仮定できれば、 、 、 ではなく、足し算と引き算を使用localtimeできmktimeますdifftime

これまでのところ、が秒constexpr bool time_tUsesSecondsを使用すると仮定しても安全かどうかを示す を使用して問題を解決しました。time_t秒単位であると想定するのが移植性がない場合time_t、その定数を自動的に初期化する方法はありますか?

time_t timeByAddingSeconds(time_t theTime, int timeIntervalSeconds) {
    if (Time_tUsesSeconds){
        return theTime + timeIntervalSeconds;
    } else {
        tm timeComponents = *localtime(&theTime);
        timeComponents.tm_sec += timeIntervalSeconds;
        return mktime(&timeComponents);
    }
}
4

6 に答える 6

16

秒単位であるという事実はPOSIX 仕様で規定されているため、POSIX 準拠の環境向けにコーディングしている場合は、それを信頼できます。

time_tC++ 標準では、 は算術型でなければならないと述べています。

とにかく、Unix タイミング システム (エポック以来 2 番目) は 2038 年にオーバーフローする予定です。そのため、この日までに、C++ 実装が他の非 int データ型 (64 ビット int またはより複雑なデータ型)。いずれにせよ、64 ビットの int に切り替えると、以前のコードとのバイナリ互換性が失われ (より大きな変数が必要になるため)、すべてを再コンパイルする必要があります。32 ビットの不透明なハンドルを使用しても、バイナリ互換性は損なわれず、基礎となるライブラリを変更できます。すべては引き続き機能しますがtime_t、秒単位の時間ではなくなり、秒単位の時間の配列のインデックスになります。このため、言及した関数を使用してtime_t値を操作することをお勧めしますtime_t

于 2013-10-19T13:42:06.203 に答える
0

(自分の質問に答える)

1つの答えは、posixを使用している限りtime_t、秒単位であり、演算が機能するtime_tはずであることを示唆しています。

2 番目の回答では、1 秒あたりの time_t を計算し、それを算術演算の係数として使用します。しかし、作られていることについてはまだいくつかの仮定がありtime_tます。

最終的に、移植性がより重要であると判断しました。コードが組み込みデバイスでサイレントに失敗することは望ましくありません。そこで私は第三の方法を使用しました。プログラムが開始してからの時間を示す整数を格納する必要があります。つまり、私は定義します

 const static time_t time0 = time(nullptr);
 static tm time0Components = *localtime(&time0);

プログラム全体で使用される時間値はすべて整数であり、 からの時間差を秒単位で示しtime0ます。time_tこのデルタ秒から移動するには、 を使用しますdifftime。に戻るにはtime_t、次のようなものを使用します。

time_t getTime_t(int timeDeltaSeconds) {
    tm components = time0Components;
    components.tm_sec += timeDeltaSeconds;
    return mktime(&components);
}

このアプローチにより、 のような操作+-安価に行うことができますが、 に戻すにtime_tはコストがかかります。時間デルタ値は、プログラムの現在の実行に対してのみ意味があることに注意してください。タイムゾーンが変更された場合は、time0Components を更新する必要があることにも注意してください。

于 2013-10-24T13:19:00.217 に答える
0

私の 2 セント: Windows では時間の経過は秒単位ですが、1 秒が次の秒に増加するのにかかる時間は通常 18*54.925 ミリ秒で、場合によっては 19*54.925 ミリ秒です。この理由は、この投稿で説明されています。

于 2013-10-19T13:53:15.440 に答える