当ブログでも度々でてくるstrtotime関数ですが、実はこの関数は問題を抱えていて、
2038年になるとプログラムの動作環境によって不具合が発生します。
どういうことか簡単に書くと、下記のようになります。
- strtotimeは1970年からの通算秒を取得する関数
- プログラムの動作環境が32bitマシンだと、戻り値(秒)は4バイト
(1バイト=8ビットなので、4バイト)
※詳しく知りたい方はググってみてください。 - 4バイトが表現できる数値は、2,147,483,647(秒)
- 2,147,483,647秒は、約38年
(2,147,483,647(秒)÷60÷60÷24÷365) - 結果、1970年+38年=2038年が上限
意外と2038年は遠いようで近いので、何とか回避する方法を見つけなくてはなりません。
それが、今回のDateTimeクラスです。
DateTimeクラスを使って日付を取得・表示するサンプルコード
さっそく、サンプルコードです。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>DateTimeの勉強</title>
</head>
<body>
<?php
//引数無しで、今日の日付でフォーマットしたインスタンスを作成する。
$DateTime_today = new DateTime();
//DateTimeクラスのformatメソッドで、DateTime_todayインスタンスの日付を表示できる。
print 'インスタンスを作成(日付指定なし) ⇒ '.$DateTime_today->format('Y-m-d').'<br>';
//今日の日付に1日加算する。
$DateTime_today->modify('+1 day');
//DateTimeクラスのformatメソッドで、DateTime_todayインスタンスの日付を表示できる。
//13行目の表示の次の日となる。
print 'インスタンスに一日加算 ⇒ '.$DateTime_today->format('Y-m-d').'<br>';
//日付を指定してDateTime_todayインスタンスを作成。
$DateTime_today = new DateTime('2040-01-23');
print '2040-01-23でインスタンス作成 ⇒ '.$DateTime_today->format('Y-m-d').'<br>';
print '加算も問題なし ⇒ '.$DateTime_today->modify('+1 day')->format('Y-m-d').'<br>';
//今月初めを指定してインスタンスを作成。
$DateTime_today = new DateTime('first day of this month');
//今月末日を指定して変数作成。
$DateTime_end = $DateTime_today->format('Y-m-t');
//$DateTime_today->format('w')で表示できるように曜日文字列を配列で用意
$youbi = ['(日)','(月)','(火)','(水)','(木)','(金)','(土)'];
print '--- 今月一覧 ---<br>';
//今月の1日から月末まで表示
for( ; $DateTime_today->format('Y-m-d')<=$DateTime_end; $DateTime_today->modify('+1 day'))
print $DateTime_today->format('Y/m/d').$youbi[$DateTime_today->format('w')].'<br>';
print '----------------<br>';
?>
</body>
</html>
このファイルをphpが動作する環境で表示してみてください。
このように、問題なく日付を表示することができました。