日付の基礎 date()


	echo date('Y-m-d'); // 本日
	echo date('U'); // 現在のUNIXタイムスタンプ
	echo date("H:i:s"); // 現在時刻
	echo strtotime('2012-12-12'); // 文字列日付からのUNIXタイムスタンプ
	echo date('Y-m-d',strtotime('2012-12-12')); // 文字列から日付
	echo date('Ymdhis', strtotime('2019-1-2 3:4:5')); // → 20190102030405
	
	2018-12-10
1544412967
04:36:07
1355266800
2012-12-12

タイムゾーンを東京に設定する | date_default_timezone_set('Asia/Tokyo');


	// タイムゾーンを東京に設定する
	date_default_timezone_set('Asia/Tokyo');
	
	// 設定されているタイムゾーンを表示する
	var_dump(date_default_timezone_get());
	

文字列から日時フォーマットを取得する関数

出力結果

>>
文字列フォーマットフォーマット(MySQL型)フォーマット(時刻優先)
2012-12-12 12:12:12Y-m-d H:i:s%Y-%m-%d %H:%i:%sY-m-d H:i:s
2012/12/12 12:12:12Y-m-d H:i:s%Y-%m-%d %H:%i:%sY-m-d H:i:s
20121212121212Y-m-d H:i:s%Y-%m-%d %H:%i:%sY-m-d H:i:s
2012-3-10 1:15:1Y-m-d H:i:s%Y-%m-%d %H:%i:%sY-m-d H:i:s
2012-1-1 1:1:1Y-m-d H:i:s%Y-%m-%d %H:%i:%sY-m-d H:i:s
2012-1-1 1:1Y-m-d H:i%Y-%m-%d %H:%iY-m-d H:i
2012-1-1 1Y-m-d H%Y-%m-%d %HY-m-d H
2012-1-1Y-m-d%Y-%m-%dY-m-d
2012-1Y-m%Y-%mY-m
2012m-d%m-%dH:i
1-1m-d%m-%dm-d
12-12m-d%m-%dm-d
1:1:1H:i:s%H:%i:%sH:i:s
12:12:12H:i:s%H:%i:%sH:i:s
12:12H:i%H:%iH:i
12d%dh
2012-32-12 12:12:12Y-m-d H:i:s%Y-%m-%d %H:%i:%sY-m-d H:i:s

番号文字列から日付を取得する関数

出力結果

番号文字列日時日時(時刻優先)
201201010101012012-01-01 01:01:012012-01-01 01:01:01
201212121212122012-12-12 12:12:122012-12-12 12:12:12
201212122012-12-122012-12-12
201201012012-01-012012-01-01
2012122020-12-1220:12:12
2012012020-12-0120:12:01
1801022018-01-0218:01:02
010101-0101:01:00
121212-1212:12:00
2018201820:18:00
010101:00:00
121212:00:00
111:00:00
222:00:00
000
a

部分的日時のフォーマット変換

検証

	/**
	 * 部分的日時のフォーマット変換
	 * @param string $str 部分的日時
	 * @param string $format1 部分的日時のフォーマット
	 * @param string $format2 変換先のフォーマット
	 * @param array $option オプション
	 *  - digit2_flg 2桁そろえフラグ    0:2桁に揃えず , 1(デフォルト):2桁に揃える( 例: 8 → 08)
	 * @return string フォーマット変換された日時
	 */
	function convDatetimeFormat($str,$format1,$format2,$option=array()){
	    
	    $digit2_flg = 1;
	    if(isset($option['digit2_flg'])) $digit2_flg = $option['digit2_flg'];
	
	    $list = preg_split("/[-\/\s:]/", $str);
	    $fmts1 = preg_split("/[-\/\s:]/", $format1);
	    $fKeys1 = array_flip($fmts1);
	    $fmts2 = preg_split("/[-\/\s:]/", $format2);
	
	    $str2 = $format2;
	    foreach($fmts2 as $i => $key){
	        $v = null;
	        if(isset($fKeys1[$key])){
	            $fk_i = $fKeys1[$key];
	            $v = $list[$fk_i];
	        }else{
	            switch ($key) {
	                case 'Y': $v = date('Y'); break;
	                case 'm': $v = '1'; break;
	                case 'd': $v = '1'; break;
	                case 'H': $v = '0'; break;
	                case 'i': $v = '0'; break;
	                case 's': $v = '0'; break;
	            }
	        }
	        
	        if(!empty($digit2_flg) && strlen($v) == 1){
	            $v = '0' . $v;
	        }
	        
	        $str2 = str_replace($key, $v, $str2);
	    }
	    return $str2;
	}
	

部分文字列から日時情報を推測するクラス DatetimeGuess.php

検証

手入力日時の自動変換

手入力による様々な日付文字列入力を正しい日付フォーマットに自動変換する関数。
全角数値は半角数値に変換される。
日付文字列の前後に文字列があっても問題ない。

クラスメソッド型
旧型(preg_match関連が安定していない) 検証


strtotimeをいろいろな日付文字列で試す

Demo

strtotime('2022-11-8');1667833200
strtotime('2022-11');1667228400
strtotime('2022');1667906520
strtotime('11');
strtotime('8');
strtotime('');
strtotime(0);
strtotime(null);
strtotime('2022-11-8 12:12:12');1667877132
strtotime('2022-11-8 12:12');1667877120
strtotime('2022-11-8 12');
strtotime('abc');
strtotime('2022/11/8 12:12:12');1667877132スラッシュ区切り
strtotime('8-11-2022 12:12:12');1667877132米国式の日付記述

一か月後

$date2 = date("Y-m-d",strtotime($date1 . "+1 month"));