回答:
Cの初期のバージョンには符号なし整数がありませんでした。(一部のプログラマーは、符号なし算術が必要なときにポインターを使用しました。)time()
関数と符号なし型のどちらが先かはわかりませんが、符号なし型が広く利用可能になる前に表現が確立されたと思います。そして、2038年は将来的には十分であり、おそらく心配する価値はなかったでしょう。Unixがそれまでにまだ存在していると多くの人が思っていたことは疑わしい。
署名のもう1つの利点は、time_t
64ビットに拡張すると(一部のシステムで既に発生している)、1970年以前の時間を表現する能力を失うことなく、数千億年先の時間を表現できることです(だから、 32ビット符号なし time_t
; 64ビットに移行するのに十分な時間を持っています。
time
関数は、エポックよりも古い:UnixのV1(1971年)は、1971年1月1日の真夜中から、1/60秒単位でカウントしました。1970年のエポックが確立されたかなり後の1978年にK&Rによって「時系列のユーザーは60分の2秒で約2.5年であることに気付く」 というのはすでに既知のバグでした。unsigned
gmtime
そしてlocaltime
今年2147483647のmaxアウト(次の秒と年として-2147483648を与えた後)。したがって、55ビットをはるかに超える時間を得るには、出力ルーチンを更新して、符号なし32ビットintではなく64ビットintを使用する必要があります。今後数十億年のうちに誰かがそのバグの世話をすることを願っています。
struct tm
型が型のメンバーtm_year
(1900年からの年数を表す)を持っていることですint
。64ビットシステムは64ビットを簡単に持つことができますが、time_t
通常は32ビットを持ちますint
。(char
8ビットでint
64ビットの場合、short
16ビットまたは32ビットのいずれかであり、他のサイズに事前定義されたタイプはありません。)しかしtime()
、おそらく唯一の機能は<time.h>
実際にシステムレベルのサポートを必要とします。独自のコードを記述して、time_t
値を人間が読み取れる文字列に変換できます。
1970年1月1日より前のタイムスタンプと日付をサポートするためです。
time_t
32ビットのみである必要はありません。多くのシステムではすでに64ビットです。
mktime()
関数は-1
エラーの場合に戻るため、1970-01-01より前の正しいタイムスタンプとエラーtsを区別することはおそらく不可能です。1970年1月1日より前の付帯日は禁止されています
1969-12-31 23:59:59 UTC
です。以外の負の値-1
は明確です。
mktime()
呼び出しを設定する必要はありませんerrno
。(POSIXはそうです。)