1

PHP バージョン 5.3.8 を使用していますが、mktime が機能しません

ここにコードがあります

$dated= mktime(0,0,0,11,5,2038);
var_dump($dated);

出力は bool(false) です。修正を提案してください

4

3 に答える 3

4

mktime は、整数であるタイムスタンプを返します (PHP では、実際には符号付き整数です)。したがって、32 ビット システムで可能な最大タイムスタンプは次のとおりです19 Jan 2038 03:14:07 UTC(その後、整数オーバーフローが発生します)。タイムスタンプを大きくするには、64 ビット整数が必要です。

于 2012-05-10T11:19:50.130 に答える
3

PHPマニュアルから:

PHP 5.1.0 より前では、負のタイムスタンプは既知のバージョンの Windows やその他のシステムではサポートされていませんでした。したがって、有効な年の範囲は 1970 年から 2038 年までに制限されていました。

考えられる解決策の 1 つは、 ADOdb Date Time Libraryを使用することです。このライブラリは、ネイティブ関数の符号付き整数 (通常は 32 ビット) を PHP 浮動小数点数 (通常は 64 ビット) に置き換えることで、この制限を克服します。

于 2012-05-10T11:13:01.117 に答える
2

C/C++ ライブラリを使用して時間を変換する場合の 3 つの重要事項。

標準ライブラリの gmtime() または localtime() は time_t から struct tm に変換しますが、time_t の分解能はエポックからの秒数です。したがって、小数秒はカウントされません。

mktime() は struct tm から time_t に逆変換しますが、入力日付が範囲外の場合は -1 を返します。(2038 年問題を参照: http://en.wikipedia.org/wiki/Year_2038_problem )

64 ビット タイムスタンプを使用していない場合は、64 ビット マシンでプログラムを実行しても、2038 年問題が発生します。gmtime64()、localtime64()、mktime64() などの 64 ビット バージョンの関数があり、年が範囲外の問題を解決する可能性があります。(参照ページ: http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Frtref%2Fmktime64.htm )

boost ライブラリを使用しても 2038 年問題を解決できないという回答。そのページから次のことに注意してください:「内部的に boost::gregorian::date は 32 ビット整数型として格納されます。」

于 2013-06-27T20:38:38.527 に答える