【PHP】日付・時間の表示・計算・判定

ちょいちょい使うのでメモ。

使用方法は2種類でDateTimeクラスかdate関数を使用するタイプ。

PHPマニュアル

各種フォーマット等はPHPマニュアルを参照してください。

PHP: date - Manual

PHP: DateTime - Manual

PHP: 日付の書式 - Manual

PHP: 時刻の書式 - Manual


現在日時の取得

現在日時を取得して表示

<?php
echo date('Y-m-d H:i:s');
<?php
$date = new DateTime();
echo $date->format('Y-m-d H:i:s');

日付/時刻のフォーマット

「Y-m-d H:i:s」→「Y年m月d日 H時i分s秒」に変換

<?php
echo date('Y年m月d日 H時i分s秒', strtotime('2019-01-23 12:34:56'));
<?php
$date = new DateTime('2019-01-23 12:34:56');
echo $date->format('Y年m月d日 H時i分s秒');

日時の妥当性チェック

checkdateという日付の妥当性チェックを行う関数がありますが、それだと日付を年月日に分解する必要があるので私なりのやり方を記載します。

PHP: checkdate - Manual

<?php
$date = '2019-01-23 12:34:56';
if(date('Y-m-d H:i:s', strtotime($date)) === $date){
    echo '有効';
}else{
    echo '無効';
}
<?php
$date = '2019-01-23 12:34:56';
try{
    if((new DateTime($date))->format('Y-m-d H:i:s') === $date){
        echo '有効';
    }else{
        echo '無効';
    }
}catch(Exception $e){
    // 日時変換時エラー
    // var_dump($e);
    echo '無効';
}

日時の加算

加算の場合「+」がなくてもがなくても+になります。

<?php
// 年
echo date('Y-m-d H:i:s', strtotime('+1 year'));
// 月
echo date('Y-m-d H:i:s', strtotime('+2 month'));
// 日
echo date('Y-m-d H:i:s', strtotime('+3 days'));
// 時
echo date('Y-m-d H:i:s', strtotime('+4 hour'));
// 分
echo date('Y-m-d H:i:s', strtotime('+5 minutes'));
// 秒
echo date('Y-m-d H:i:s', strtotime('+6 seconds'));

// 任意の日時からの加算
echo date('Y-m-d H:i:s', strtotime('2019-01-23 12:34:56 + 1 year'));
<?php
// 年
$date = new DateTime('+1 year');
echo $date->format('Y-m-d H:i:s');
// 月
$date = new DateTime('+2 month');
echo $date->format('Y-m-d H:i:s');
// 日
$date = new DateTime('+3 days');
echo $date->format('Y-m-d H:i:s');
// 時
$date = new DateTime('+4 hour');
echo $date->format('Y-m-d H:i:s');
// 分
$date = new DateTime('+5 minutes');
echo $date->format('Y-m-d H:i:s');
// 秒
$date = new DateTime('+6 seconds');
echo $date->format('Y-m-d H:i:s');

// 任意の日時からの加算
$date = new DateTime('2019-01-23 12:34:56');
$date->modify('+ 1 year');
echo $date->format('Y-m-d H:i:s');

日時の減算

減算の場合「-」を入れ忘れると加算になるので注意

<?php
// 年
echo date('Y-m-d H:i:s', strtotime('-1 year'));
// 月
echo date('Y-m-d H:i:s', strtotime('-2 month'));
// 日
echo date('Y-m-d H:i:s', strtotime('-3 days'));
// 時
echo date('Y-m-d H:i:s', strtotime('-4 hour'));
// 分
echo date('Y-m-d H:i:s', strtotime('-5 minutes'));
// 秒
echo date('Y-m-d H:i:s', strtotime('-6 seconds'));

// 任意の日付からの加算
echo date('Y-m-d H:i:s', strtotime('2019-01-23 12:34:56 - 1 year'));
<?php
// 年
$date = new DateTime('-1 year');
echo $date->format('Y-m-d H:i:s');
// 月
$date = new DateTime('-2 month');
echo $date->format('Y-m-d H:i:s');
// 日
$date = new DateTime('-3 days');
echo $date->format('Y-m-d H:i:s');
// 時
$date = new DateTime('-4 hour');
echo $date->format('Y-m-d H:i:s');
// 分
$date = new DateTime('-5 minutes');
echo $date->format('Y-m-d H:i:s');
// 秒
$date = new DateTime('-6 seconds');
echo $date->format('Y-m-d H:i:s');

// 任意の日付からの加算
$date = new DateTime('2019-01-23 12:34:56');
$date->modify('- 1 year');
echo $date->format('Y-m-d H:i:s');

日時の加減算 同時&複合

減算の場合「-」を入れ忘れると加算になるので注意

<?php
echo date('Y-m-d H:i:s', strtotime('2019-01-23 12:34:56 -1year -2 month -3 days +4 hour +5 minutes +6 seconds'));
<?php
$date = new DateTime('2019-01-23 12:34:56');
$date->modify('-1year -2 month -3 days +4 hour +5 minutes +6 seconds');
echo $date->format('Y-m-d H:i:s');

月末

フォーマット「t」にて月末日を返してもらえます。

<?php
echo date('t', strtotime('2019-01-23 12:34:56'));
echo date('Y-m-t H:i:s', strtotime('2019-01-23 12:34:56'));
<?php
$date = new DateTime('2019-01-23 12:34:56');
echo$date->format('t');
echo$date->format('Y-m-t');

日時の比較

<?php
if (strtotime('2020-03-26 16:40:02') > strtotime('2019-01-23 12:34:56')) {

} else {

}
<?php
$d1 = new DateTime('2020-03-26 16:40:02');
$d2 = new DateTime('2019-01-23 12:34:56');
if ($d1  > $d2) {

} else {

}

日時の差分

date関数は日付差分のみになります。

<?php
$diff = (strtotime('2020-03-26 16:40:02') - strtotime('2019-01-23 12:34:56'));
// 日付の差分
echo (strtotime('2019-01-30') - strtotime('2019-01-23')) / ( 60 * 60 * 24);

DateInterval::formatのフォーマットを使用して出力します。

PHP: DateInterval::format - Manual

<?php
$datetime1 = new DateTime('2020-03-26 16:40:02');
$datetime2 = new DateTime('2019-01-23 12:34:56');
$interval = $datetime1->diff($datetime2);

// 年月日秒の差分
echo $interval->format('%y years %m months %d days %h hours %i minutes %s second(s)');
// 日付の差分
echo $interval->format('%a days');

年齢の出し方

<?php
$birthday = date('Ymd', strtotime('1988-05-08'));
echo 'age:'.floor((date('Ymd')-$birthday)/10000).' years';
<?php
$birthday = new DateTime('1988-05-08');
echo $birthday->diff(new DateTime())->format('age:%y years');

うるう年判定

checkdateという日付の妥当性チェックを行う関数がありますが、それだと日付を年月日に分解する必要があるので私なりのやり方を記載します。

PHP: checkdate - Manual

<?php
echo (date('L', strtotime('2019-01-23'))) ? 'うるう年' : 'うるう年ではない';
format('L') ? 'うるう年' : 'うるう年ではない';

注意点

出来れば覚えておいて欲しい細かな仕様です。

自動丸め

自動的にPHPのdate関数、DateTimeクラスを使用する中で、入力された値が丸められてしまうことがあるので注意してください。

日付は最大で「31日」まで入力可能で、例えば2月31日を指定した場合に自動で丸められてしまいます。

秒はうるう秒対策のためか「60秒」まで入れることが可能です。

<?php
echo date('Y-m-d', strtotime('2019-02-31'));
echo date('Y-m-d H:i:s', strtotime('2019-01-23 12:34:60'));
<?php
echo (new DateTime('2019-02-31'))->format('Y-m-d');
echo (new DateTime('2019-01-23 12:34:60'))->format('Y-m-d H:i:s');

1ヶ月の加減算

1ヶ月の加減算を行う際に注意点が2点。

加算の場合は、月の値に単純に+1が行われるみたいなので、1月31日などの31日が存在する月の場合に1月31日 + 1ヶ月→2月31日→3月3日となり自動的に丸められるようです。

減算の場合は、11ヶ月を減算するとしたら3月31日 - 11ヶ月(10ヶ月 - 30日(4月(対象月の日数)の日数))= 5月1日という計算をしているようです。

<?php
// 加算
echo date('Y-m-d', strtotime('2019/01/31 +1month')).PHP_EOL;

// 減算
echo date('Y-m-d', strtotime('2019/03/31 -11month')).PHP_EOL;
<?php
// 加算
$date = new DateTime('2019/01/31 +1month');
echo $date->format('Y-m-d').PHP_EOL;

// 減算
$date = new DateTime('2019/03/31 -11month');
echo $date->format('Y-m-d').PHP_EOL;

サンプル

上記のサンプルを全てこちらに記載いたしました。

まとめ

結構ちょくちょく使っていましたが、色々なことがわかりました。

特に注意点で記載した内容については注意しておかなければバグの原因になると思います。


0 件のコメント :

コメントを投稿