Unixがタイムスタンプを符号付き整数で保存するのはなぜですか?


24

タイムスタンプを表すために符号付き整数が使用されるのはなぜですか?1970年には0として表される明確に定義された開始点がありますが、その前に数字が必要なのはなぜですか?負のタイムスタンプはどこでも使用されていますか?


2
そのため、ノストラダムスはコンピューターを使用して3000年以上の予測を書くことができませんでした。彼らはそれをY3Kバグか何かと呼んだと思う!
ジーチ

3
古代ローマ人は、年数が負から正に変わったときに、さらに悪い問題を抱えていました。数字のゼロを表現する方法があれば、彼らはそれをY0K問題と呼んでいたでしょう。8
キーストンプソン

回答:


35

Cの初期のバージョンには符号なし整数がありませんでした。(一部のプログラマーは、符号なし算術が必要なときにポインターを使用しました。)time()関数と符号なし型のどちらが先かはわかりませんが、符号なし型が広く利用可能になる前に表現が確立されたと思います。そして、2038年は将来的には十分であり、おそらく心配する価値はなかったでしょう。Unixがそれまでにまだ存在していると多くの人が思っていたことは疑わしい。

署名のもう1つの利点は、time_t64ビットに拡張すると(一部のシステムで既に発生している)、1970年以前の時間を表現する能力を失うことなく、数千億年先の時間を表現できることです(だから、 32ビット符号なし time_t ; 64ビットに移行するのに十分な時間を持っています。


7
time関数は、エポックよりも古い:UnixのV1(1971年)は、1971年1月1日の真夜中から、1/60秒単位でカウントしました。1970年のエポックが確立されたかなり後の1978年にK&Rによって「時系列のユーザーは60分の2秒で約2.5年であることに気付く」 というのはすでに既知のバグでした。unsigned
ジル 'SO-悪であるのをやめる'

64ビットLinuxボックスで簡単なテストを行いました。gmtimeそしてlocaltime今年2147483647のmaxアウト(次の秒と年として-2147483648を与えた後)。したがって、55ビットをはるかに超える時間を得るには、出力ルーチンを更新して、符号なし32ビットintではなく64ビットintを使用する必要があります。今後数十億年のうちに誰かがそのバグの世話をすることを願っています。
freiheit

@freiheit:興味深い。そこに問題があるのは、そのstruct tm型が型のメンバーtm_year(1900年からの年数を表す)を持っていることですint。64ビットシステムは64ビットを簡単に持つことができますが、time_t通常は32ビットを持ちますint。(char8ビットでint64ビットの場合、short16ビットまたは32ビットのいずれかであり、他のサイズに事前定義されたタイプはありません。)しかしtime()、おそらく唯一の機能は<time.h>実際にシステムレベルのサポートを必要とします。独自のコードを記述して、time_t値を人間が読み取れる文字列に変換できます。
キーストンプソン

12

1970年1月1日より前のタイムスタンプと日付をサポートするためです。


1
これは過去190年のわずか68年です。これはかなり少ないようです。
バクダン

2
POSIXはtime_t32ビットのみである必要はありません。多くのシステムではすでに64ビットです。
キーストンプソン

1
mktime()関数は-1エラーの場合に戻るため、1970-01-01より前の正しいタイムスタンプとエラーtsを区別することはおそらく不可能です。1970年1月1日より前の付帯日は禁止されています
-DimG

@DimG:エラーと特定のタイムスタンプを区別することは困難1969-12-31 23:59:59 UTCです。以外の負の値-1は明確です。
キーストンプソン

1
@mtraceur:C標準では、失敗するmktime()呼び出しを設定する必要はありませんerrno。(POSIXはそうです。)
キーストンプソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.