<?php
/**
 * 日付時刻関連関数
 * @package timeutility
 * @category static function
 * @since 2010-11-11
 * @version 1.0.0
 * @access 2010-11-11
 * @copyright almex.inc
 * @author s.kurata
 */
	date_default_timezone_set('Asia/Tokyo');	

	/**
	 * 現在秒、マイクロ秒取得
	 * @name microtime_float
	 * @param $usec マイクロ秒
	 * @param $sec 秒
	 * @return usec sec
	 */
	function getmicrosec(&$usec,&$sec)
	{
	    list($usec, $sec) = explode(" ", microtime());
	    return ((float)$usec + (float)$sec);
	}
	
	/**
	 * 現在マイクロ秒取得
	 * @name getusec
	 * @return usec マイクロ秒(text)
	 */
	function getusec()
	{
		getmicrosec($usec,$sec);
	    return substr($usec,2);
	}
	
	/**
	 * 現在ミリ秒取得
	 * @name getusec
	 * @return msec ミリ秒(text)
	 */
	function getmsec()
	{
		getmicrosec($usec,$sec);
	    return substr($usec,2,3);
	}

	/**
	 * 現在日時取得(ミリ秒)  YYYY-MM-DD hh:mm:ss.zzz
	 * @name getnowstr_YMDhmsz
	 * @param $date_delimiter 日付区切り文字（初期値 '-'）
	 * @param $time_delimiter 時間区切り文字（初期値 ':'）
	 * @param $msec_delimiter ミリ秒区切り文字（初期値 '.'）
	 */
	function getnowstr_YMDhmsz($date_delimiter = '-',$time_delimiter = ':',$msec_delimiter = '.') {
		$datenow = date('Y'.$date_delimiter.'m'.$date_delimiter.'d H'.$time_delimiter.'i'.$time_delimiter.'s'.$msec_delimiter);
		return $datenow.getmsec();
	}
	
	/**
	 * 現在日時取得(マイクロ秒)  YYYY-MM-DD hh:mm:ss.zzzuuu
	 * @name getnowstr_YMDhmszu
	 * @param $date_delimiter 日付区切り文字（初期値 '-'）
	 * @param $time_delimiter 時間区切り文字（初期値 ':'）
	 * @param $usec_delimiter マイクロ秒区切り文字（初期値 '.'）
	 */
	function getnowstr_YMDhmszu($date_delimiter = '-',$time_delimiter = ':',$usec_delimiter = '.') {
		$datenow = date('Y'.$date_delimiter.'m'.$date_delimiter.'d H'.$time_delimiter.'i'.$time_delimiter.'s'.$usec_delimiter);
		return $datenow.getusec();
	}
	
	/**
	 * 現在日時取得(秒)  YYYY-MM-DD hh:mm:ss
	 * @name getnowstr_YMDhms
	 * @param $date_delimiter 日付区切り文字（初期値 '-'）
	 * @param $time_delimiter 時間区切り文字（初期値 ':'）
	 */
	function getnowstr_YMDhms($date_delimiter = '-',$time_delimiter = ':') {
		$datenow = date('Y'.$date_delimiter.'m'.$date_delimiter.'d H'.$time_delimiter.'i'.$time_delimiter.'s');
			return $datenow;
	}
	
	/**
	 * 現在時刻時取得(分単位)  hh:mm
	 * @name getnowstr_min
	 * @param $time_delimiter 時間区切り文字（初期値 ':'）
	 */
	function getnowstr_min($time_delimiter = ':') {
		$timenow = date('H'.$time_delimiter.'i');
			return $timenow;
	}
	
	/**
	 * 現在時刻時取得(秒単位)  hh:mm:ss
	 * @name getnowstr_sec
	 * @param $time_delimiter 時間区切り文字（初期値 ':'）
	 */
	function getnowstr_sec($time_delimiter = ':') {
		$timenow = date('H'.$time_delimiter.'i'.$time_delimiter.'s');
			return $timenow;
	}
	/**
	 * 日時比較関数
	 * @name diffdatetime
	 * @param $adate 比較する日時
	 * @param $basedate 基準日時（default 現在日時）
	 * @return 基準時間からの差（integer）
	 */
	function diffdatetime($adate,$basedate = false) {
		if (!$basedate) $basedate = getnowstr_YMDhms();
		$st1 = strtotime($adate);
		$st2 = strtotime($basedate);
		$diff = $st1 - $st2;
		return $diff;
	}
	
	/**
	 * 時間比較関数
	 * @name difftime
	 * @param $atime 比較する日時
	 * @param $basetime 基準時間（default 現在時間）
	 * @return 基準時間からの差（integer）
	 */
	function difftime($atime,$basetime = false) {
		if (!$basetime) $basetime = getnowstr_sec();
		$hstr = substr($atime,0,2);
		if ($hstr > 23 ) {
			$atime = ($hstr - 23 -1).substr($atime,2,6);
			$atime = incdayex(1,$atime);
			$basetime = getnowstr_YMDhms();
		}
		
		$st1 = strtotime($atime);
		$st2 = strtotime($basetime);
		$diff = $st1 - $st2;
		return $diff;
	}

	/**
	 * 時間範囲検査関数（現在日時基準）
	 * @name checktimerange
	 * @param $start 開始時刻
	 * @param $last 終了時刻
	 * @return bool値：true=範囲内、false範囲外
	 */
	function checktimerange($first,$last) {
		//入力時間の補正
		//0-23は補正なし
		//24以上は補正する
		//開始時間補正
		$now = getnowstr_sec();
		$nowst = strtotime($now);
		$hstr = substr($first,0,2);
		if ($hstr > 23) $first = ($hstr - 23 -1).substr($first,2,6);
		//終了時間補正
		$hstr = substr($last,0,2);
		if ($hstr > 23)  $last = ($hstr - 23 -1).substr($last,2,6);
		$fst = strtotime($first);
		$lst = strtotime($last);
		$diff = $lst - $fst;
				
		if ($diff >= 0) {
		//開始終了が同一日の判定
			$diff_f = $fst - $nowst;
			$diff_l = $lst - $nowst;
			if (($diff_f <= 0) && ($diff_l >=0)) {
				return true;
			} else {
				return false;
			}
			return  $bret;
		} else {
		//終了時刻が翌日にまたぐ場合の判定
			$diff_f = $fst - $nowst;
			$diff_l = $lst - $nowst;
			if (($diff_l <= 0) && ($diff_f >= 0)) {
				return false;
			} else {
				return true;
			}
		}
	}
	
	/**
	 * 時間差分計算関数
	 * @name diffdatetime
	 * @param $adate 比較する日時
	 * @param $basedate 基準日時（default 現在日時）
	 * @return 差分（text）
	 */
	function betweentime($adate,$basedate = false,$sign = 'NOABS') {
		if (!$basedate) $basedate = getnowstr_YMDhms();
		$st1 = strtotime($adate);
		$st2 = strtotime($basedate);
		$diff = $st1 - $st2;
		
		if ($sign == 'ABS') {
			$diff = abs($diff);
		}
		
		$str = round($diff/60).':'.ABS($diff%60);  
		return $str;
	}
	
	/**
	 * 秒加算関数
	 * @name incsecond
	 * @param $secs 加算秒数
	 * @param $basedate 基準日時文字列（Y-m-d H:i:s）
	 * @return 日付文字列（Y-m-d H:i:s）
	 */
	function incsecond($secs,$basedate = false) {
		if (!$basedate) $basedate = date('Y-m-d H:i:s');
		$ts = strtotime($basedate);
		$ts = strtotime($secs.' second', $ts);
		return date('Y-m-d H:i:s',$ts);
	}
	
	/**
	 * 分加算関数
	 * @name incminute
	 * @param $mins 加算分数
	 * @param $basedate 基準日時文字列（Y-m-d H:i:s）
	 * @return 日付文字列（Y-m-d H:i:s）
	 */
	function incminute($mins,$basedate = false) {
		if (!$basedate) $basedate = date('Y-m-d H:i:s');
		$ts = strtotime($basedate);
		$ts = strtotime($mins.' minute', $ts);
		return date('Y-m-d H:i:s',$ts);
	}
	
	/**
	 * 時間加算関数
	 * @name inchour
	 * @param $hours 加算時間数
	 * @param $basedate 基準日時文字列（Y-m-d H:i:s）
	 * @return 日付文字列（Y-m-d H:i:s）
	 */
	function inchour($hours,$basedate = false) {
		if (!$basedate) $basedate = date('Y-m-d H:i:s');
		$ts = strtotime($basedate);
		$ts = strtotime($hours.' hour', $ts);
		return date('Y-m-d H:i:s',$ts);
	}
	
	/**
	 * 日付加算関数
	 * @name incday
	 * @param $days 加算日数
	 * @param $basedate 基準日付文字列（Y-m-d）
	 * @return 日付文字列（Y-m-d）
	 */
	function incday($days,$basedate = false) {
		if (!$basedate) $basedate = date('Y-m-d');
		$ts = strtotime($basedate);
		$ts = strtotime($days.' day', $ts);
		return date('Y-m-d',$ts);
	}
	function incdayex($days,$basedate = false) {
		if (!$basedate) $basedate = date('Y-m-d');
		$ts = strtotime($basedate);
		$ts = strtotime($days.' day', $ts);
		return date('Y-m-d H:s:i',$ts);
	}
	
	/**
	 * 月加算関数
	 * @name incmonth
	 * @param $months 加算月数
	 * @param $basedate 基準日付文字列（Y-m-d）
	 * @param $lastday 月最終日の場合の処理指定（true：最終日、false：翌月1日）
	 * @return 日付文字列（Y-m-d）
	 */
	function incmonth($months,$basedate = false,$lastday=true) {
		if (!$basedate) $basedate = date('Y-m-d');
		$ts = strtotime($basedate);
		$day = date('d',$ts);
		if ($day < 29) {
			$ts = strtotime($months.' month', $ts);
			return date('Y-m-d',$ts);
		} else {
			$ts2 = strtotime($months.' month',strtotime(date('Y-m-1',$ts)));
			$ts2 = monthoflastday(date('Y-m-d',$ts2),true);
			$last = date('d',$ts2);
			if ($day > $last) {
				$last = date('Y-m-d',$ts2);
				if (!$lastday) {
					$last = incday(1,$last);
				} 
				return  $last;
			} else {
				$ts = strtotime($months.' month', $ts);
				return date('Y-m-d',$ts);
			}
		}
	}
	
	/**
	 * 基準日の月最終日取得関数
	 * @name incmonth
	 * @param $basedate 基準日付文字列（Y-m-d）
	 * @return 日付文字列（Y-m-d）
	 */
	function monthoflastday($basedate = false,$timestamp = false) {
		if (!$basedate) $basedate = date('Y-m-d');
		$ts = strtotime($basedate);
		$lastmonth = incmonth(1,date('Y-m-1',$ts));
		$ts = strtotime($lastmonth);
		$ts = strtotime('-1 day',$ts);
		if ($timestamp) {
			return $ts;
		} else {
			return date('Y-m-d',$ts);
		}
	}
	
	/**
	 * 翌週同曜日の取得関数
	 * @name nextweekday
	 * @param $basedate 基準日付文字列（Y-m-d）
	 * @return 日付文字列（Y-m-d）
	 */
	function nextweekday($basedate = false) {
		if (!$basedate) $basedate = date('Y-m-d');
		$ts = strtotime($basedate);
		$ts = strtotime('7 day',$ts);
		return date('Y-m-d',$ts);
	}
	
	/**
	 * 前週同曜日の取得関数
	 * @name lastweekday
	 * @param $basedate 基準日付文字列（Y-m-d）
	 * @return 日付文字列（Y-m-d）
	 */
	function lastweekday($basedate = false) {
		if (!$basedate) $basedate = date('Y-m-d');
		$ts = strtotime($basedate);
		$ts = strtotime('-7 day',$ts);
		return date('Y-m-d',$ts);
	}
?>