カレンダー スクリプトを実行したところ、PHP のタイムスタンプには 2038 までの制限があることがわかりました。これはどういう意味ですか? 2050 年や 2039 年ではなく、なぜ 2038 年なのか? タイムスタンプが特定の日付 (1970 年) からの秒数をカウントするだけの場合、なぜ制限するのですか?
4 に答える
この制限は、ほとんどの C ライブラリがそのカウントを表すために使用する 4 バイトの符号付き整数によって課されます。簡単な計算 (1 年を 365 日と仮定しますが、正確ではありません):
2147483648 seconds ~ 68.1 years
これは、下限が ~1900 であることも意味します。一部のライブラリは 64 ビットのエポック カウントを導入し始めていますが、現時点ではほとんどありません。
32ビット整数の最大値は2,147,483,647です。それに+1を加えると、-2,147,483,647になります。01-01-1970 00:00:00から2,147,483,647秒は2038年1月19日です。さらに1秒追加すると、1902年のどこかに日付が表示されます。
32 ビット マシンでの INT データ型の制限のため
http://php.net/manual/en/function.mktime.php
php.net から:「mktime() および gmmktime() で受け入れられる最大の日付は、現在の場所のタイム ゾーンに依存します。
たとえば、32 ビットのタイムスタンプ オーバーフローは 2038-01-19T03:14:08+0000Z で発生します。ただし、UTC -0500 タイム ゾーン (北米の EST など) にいる場合、オーバーフローするまでの最大許容時間 (Windows の古い PHP バージョンの場合) は、 mktime() または gmmktime() に渡すかどうか。"
私の推測では、タイムスタンプが取得できるサイズの制限を意味する固定ビット数に格納されていると思います。それを正確に把握するために、いくつかの計算を行うことができます。