ここの人が最大の time_t
を設定する方法に答えているので 値、およびそのタイプについてさらに推測を行うと、 c++
を追加すると思いました 方法:
#include <limits>
...
time_t maxTime = std::numeric_limits<time_t>::max();
time_t
に何が入るかはあまり気にしません 、しかし合理的なことについて。私が見たどのシステムでも、time_t
63 年から 10 年までのタイムスパンをエンコードできます (これらの天才が 1999 年に Y2K 世界の終わりを思いついたとき以来、私が知っているほとんどすべてのシステムは 64 ビットの数値を使用しています。 2038年が過ぎたときの「出来事」)
あなたが合理的に期待するなら プログラムの実行期間が 50 年以内であることを確認するか、50*365*86400 を超える値を拒否するか、単純に値を飽和させます。私が現在書いているプログラムが 50 年後に使用されるとは思っていません (ただし、それを検証するために生きているわけではありません)。
一方、システムが そう 32 ビットの time_t
を使用する いずれにせよ、システム時間は 50 年でオーバーフローするため、エポックをシフトせずに意味のある時間を構成することはできません。
「どのくらい休止しますか?」と聞かれたらユーザーが「250年」と言った場合、「そうです、50年もそうです」と言ったとしても、それは本当に間違ったプログラムの動作ではないと思います。なぜなら、違いは実際には観察できないからです.
ウィキペディアによると、time_t
整数または浮動小数点数の場合がありますが、通常は 32 ビットまたは 64 ビットの符号付き整数です。あなたが想定できる最大の安全な値は INT_MAX
だと思います . time_t
の場合 少なくとも負の数は合法であり、1970 年 1 月 1 日より前を参照します。
残念ながら、ISO C 標準 (現在の C11) は time_t
の最大値を取得する方法を提供していません。 .したがって、情報を提供する Autoconf などのツールを使用しない限り、いくつかの仮定を行う必要があります。
time_t
と仮定すると パディングビットのない整数型 (すべてではないにしても、最近のほとんどのプラットフォームでこれが当てはまります) の場合、おそらく次の値を取ることができます:
(((time_t) 1 << (sizeof(time_t) * CHAR_BIT - 2)) - 1) * 2 + 1
これは、符号付き整数型の表現可能な最大値です (ただし、値が time_t
で表現可能であるという事実 time_t
としてシステムでサポートされているという意味ではありません 値)
time_t
かどうかを検出することもできます。 整数型です。 ISO C 標準では、time_t
が指定されています。 は実数型です (7.27.1 節)。定義上、実数 整数型または 実数浮動小数点型 のいずれかです (float
、 double
または long double
、および 6.11.1 節で言及されているように、標準の将来のバージョンで追加される可能性がある他のもの)。したがって、 time_t
の場合 は整数型ではなく、必ず実浮動小数点型です。結果として、time_t
かどうかを検出できます。 テスト (time_t) 1 / 2 == 0
の整数型です .
注:C 標準では、(T) 1 / 2
は厳密には要求されていません。 T
の場合は 0 とは異なります は浮動小数点型ですが、そうでない場合、そのようなプラットフォームでは浮動小数点計算で深刻な問題が発生するのではないかと思います.