web-dev-qa-db-ja.com

最大時間()| PHP

これは一種のばかげた質問ですが、time()の最大INT値は何であり、それは将来の日付です。

2999年1月1日

Time()がその値に達することはありますか?大きなtime()値を取得すると、次のようになります。

1970年1月1日木曜日1:00 AM

通常のint日付

1287320788-今日の日付を出力:2010年10月17日日曜日2:06 PM

しかし、私は最大のint日付と最後の日付だけに興味があります。

20
MacMac

最後の32ビット整数のタイムスタンプは2038年1月19日に到達します。これは 2038年問題 として知られています。

38
Pekka 웃

PHPは、表現できる最大の整数をPHP_INT_MAX定数に格納します。

date('Y-m-d H:i:s', PHP_INT_MAX); // 2038-01-19 04:14:07

それ以降の日付で作業する場合は、 DateTime API の使用を検討してください。例:.

$dt = new DateTime('1st January 2999');
$dt->add(DateInterval::createFromDateString('+1 day'));
echo $dt->format('Y-m-d H:i:s'); // 2999-01-02 00:00:00
echo $dt->format('U');           // 32472226800
30
Gordon

Y2038問題は64ビットシステムには当てはまらないことに注意してください。

5
oglgo

私が知っている最短の方法は、明日の日付を取得することです。

date( "Y-n-j"、strtotime( "+ 1 day"))

64ビットシステムのdate("Y-n-j", PHP_INT_MAX)は、潜在的に危険な値を示します:292277026596-12-4

1

DateTimeは64ビットサーバーでも32ビットを使用しているようです。だからあなたはトラブルに巻き込まれます。

私はそれをこのように解決しました:

new DateTime("99999/12/31 00:00:00");

日付はDateTimeの最大長をオーバーフローするため、dateは最大可能値を使用し、次のようなDateTimeオブジェクトを返します(var_dumpで検査)。

object(DateTime)#9 (3) { ["date"]=> string(19) "2031-09-12 00:00:00" ["timezone_type"]=> int(3) ["timezone"]=> string(13) "Europe/Berlin" } }

PHPのバージョンと異なるかどうかはわかりません。バージョン5.4でテストしました。

0

64ビットプラットフォームの場合PHP_INT_MAXは、32ビットプラットフォームの最大INT値を反映していません。入手方法は次のとおりです。

$max32bitInt = PHP_INT_SIZE == 4 ? PHP_INT_MAX : PHP_INT_MAX>>32;

常に64ビットプラットフォームを使用している場合は、次を使用してください。

PHP_INT_MAX>>32
0
sanmai