2012-02-05 16 views
5

私はすべての3台のサーバー上で次の操作を実行し、3つのサーバーを持っている:phpのstrtotimeが2099年の日付で動作しない原因は何ですか?

echo strtotime('2099-12-31'); 
echo strtotime(date('Y-m-d')); 

は私を取得します。

サーバ#1:(PHP 5.3.8、64ビット)

4102376400 
1328418000 

サーバー2を:(PHP 5.3.2,32ビット)

**[nothing]** 
1328418000 

サーバ#3:(php 5.3.2 - 64bit

4102376400 
1328418000 

strtotimeはサーバの1つでは動作しませんが、他のサーバでは動作しません。これらの3つはすべて、php.iniのデフォルトのtimezoneとdate.timezoneの設定を持っています(効果があるかどうかはわかりません)。私もエラーをオンにして、何も見ていない。

+3

サーバ2は32ビットですか? –

+2

まあ、日付が32ビットのUnixエポック(2038年以降の任意の日付)の外にあるのに十分な大きさの推測では。それは32ビット対64ビットのものでしょうか? –

+3

あなたのサーバーの1台がマヤ預言を考慮に入れます。 – dqhendricks

答えて

9

おそらく32ビットの問題です。 (私が強調し)それは私の64ビットサーバー上でうまく動作しますが、私の32ビットUbuntuはmanualにこのノートを参照してください詳細についてはstrtotime('2099-12-31')

にfalseを返します。

有効範囲のタイムスタンプは、通常、金曜日、1901年12月13日20:45:54 UTCから火曜日、2038年1月19日03:14:07 UTCです。 (これらは、32ビット符号付き整数の最小値と最大値に対応する日付です)また、すべてのプラットフォームで負のタイムスタンプがサポートされているわけではないため、日付範囲がUnixエポックよりも前に制限される場合があります。これは例えば1970年1月1日より前の日付は、Windows、一部のLinuxディストリビューション、その他のオペレーティングシステムでは動作しません。 PHP 5.1.0以降ではこの制限を克服しています。

64ビットバージョンのPHPの場合、有効なタイムスタンプの範囲は実質的に無限で、64ビットはどちらの方向でも約2,930億年に相当する可能性があるためです。 docsを1として

+4

PHPマニュアルはとても愚かです。 2,930億〜無限大の大きな違いがあります。 –

+3

それは "効果的に"来るところです。 – ceejayoz

+1

私はこれらのコメントをひどくして書き留めさせる唯一の効果があります。 –

2

タイムスタンプの有効範囲は、金、典型的には、1901年12月13日(火)に20時45分54秒UTC、2038年1月19日午前3時14分07秒UTC。 (これらは、32ビット符号付き整数の最小値と最大値に対応する日付です。)また、すべてのプラットフォームで負のタイムスタンプがサポートされているわけではないため、日付範囲はUnixエポック以前に制限される場合があります。これは例えば1970年1月1日より前の日付は、Windows、一部のLinuxディストリビューション、その他のオペレーティングシステムでは動作しません。 PHP 5.1.0以降ではこの制限を克服しています。

64ビットバージョンのPHPの場合、有効なタイムスタンプの範囲は実質的に無限で、64ビットはどちらの方向でも約2,930億年に相当する可能性があるためです。

たとえば、2019-12-31は、期待どおりに動作します。

関連する問題