• ベストアンサー

PHPでタイムスタンプ以外の更新日を取得する方法は

filemtimeで更新日を取得できますが、これはタイムスタンプですよね。 2038年問題を考えると、タイムスタンプを使うものは極力避けたいと思っております。 DateTimeみたいに、タイムスタンプ以外のもので、ファイルの更新日を取得できるものはありませんか?

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.2

正直、timestamp型以外でファイルの更新日を取得できる方法はもうエクステンションを書くしかないと思われる(PEARのライブラリーとか探したところでその後ろでfiletimeを使っているはず)ので、timestamp型を避けたい理由の方をどうにかしようと思う。 まずそもそも論としてPHPのtimestamp型に2038年問題は事実上無いと言って差し支えないだろう。 Linux上では既に64ビット版のPHPで2038年問題は解決している。9999年どころか10000年4月6日だって表現できるようになっている。 CentOS 6.6 x86_64でCentOS標準リポジトリーにあるPHPを使って以下のテストコードを実行してみると良い。西暦2000年1月1日と西暦3000年1月1日と西暦10000年1月1日を全て正しく表現できることが分かるだろう。 問題はWindows上での動作だが、Experimentalながらも64ビット版が公式から提供されている。なんだけど、これは動かない。64ビット版のWindowsと64ビット版のPHPを使っても$time2と$time3がfalseになる(つまりmktimeがfalseを返す)。 じゃあ駄目じゃんと思うだろうけど、それは2038年までには解決するよ! きっと! どこか忘れたけど(公式フォーラムだったか?)ちょっと前にこの問題は次のメジャーバージョンで対応しようぜ(つまり今出てるバージョンでは対応しないぜ)という話題が出てたので、次のバージョンが2038年までに出れば解決だ。 関係ないけどテストコードの一番下の行に「?>」が無いのは誤記やミスではない。PHPではファイル最後尾の「?>」は省略する事ができる(というか書かないべきだと私は思っている)。 ----テストコード---- <?php $time1 = mktime(0, 0, 0, 1, 1, 2000); $time2 = mktime(0, 0, 0, 1, 1, 3000); $time3 = mktime(0, 0, 0, 1, 1, 10000); var_dump($time1); var_dump($time2); var_dump($time3); echo date('Y-n-j', $time1) . "\n"; echo date('Y-n-j', $time2) . "\n"; echo date('Y-n-j', $time3) . "\n";

その他の回答 (2)

noname#244856
noname#244856
回答No.3

訂正: 「Windowsにおいては」なのでLinuxなら環境を64bitにそろえればいいだけですね。WindowsにおいてはPHP7より古いバージョンでは対応出来ません。

noname#244856
noname#244856
回答No.1

PHP7未満のバージョンでは対応できません。 参考: https://teratail.com/questions/8113

関連するQ&A