日時入力チェックのバリデーション

2012/12/12 12:34:561
2012/12/12 12:34:60
2012-12-12 12:34:591
2012-2-29 12:34:591
2015-2-29 12:34:59
1800-01-01 00:00:001
2999-01-01 00:00:001
2999-01-01 23:59:591
2000-12-31 23:59:591
2000-12-31
23:59:59
1
あいうえお

	/**
	 * 日時入力チェックのバリデーション
	 * ※日付のみあるいは時刻は異常と見なす。
	 * @param $strDateTime	日時文字列
	 * @param $reqFlg	必須許可フラグ
	 * @return boolean	true:正常   false:異常
	 */
	function isDatetime($strDateTime,$reqFlg){

		//空値且つ、必須入力がnullであれば、trueを返す。
		if(empty($strDateTime) && empty($reqFlg)){
			return true;
		}
		
		//空値且つ、必須入力がtrueであれば、falseを返す。
		if(empty($strDateTime) && !empty($reqFlg)){
			return false;
		}
	
	
		//日時を 年月日時分秒に分解する。
		$aryA =preg_split( '|[ /:_-]|', $strDateTime );
		if(count($aryA)!=6){
			return false;
		}
		
		foreach ($aryA as $key => $val){
				
			//▼正数以外が混じっているば、即座にfalseを返して処理終了
			if (!preg_match("/^[0-9]+$/", $val)) {
				return false;
			}
			
		}
		
		//▼グレゴリオ暦と整合正が取れてるかチェック。(閏年などはエラー) ※さくらサーバーではemptyでチェックするとバグになるので注意。×→if(empty(checkdate(12,11,2012))){・・・}
		if(empty(checkdate($aryA[1],$aryA[2],$aryA[0]))){
			return false;
		}
	
		//▼時刻の整合性をチェック
		if($aryA[3] < 0 || $aryA[3] > 23){
			return false;
		}
		if($aryA[4] < 0 ||  $aryA[4] > 59){
			return false;
		}
		if($aryA[5] < 0 || $aryA[5] > 59){
			return false;
		}
		
		return true;
	}

(c)wacgance 2015-10-05