⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adodb-time.inc.php

📁 缺陷管理系统。Apache+PHP+MySQL 支持E-amil功能。是企业级开发中不可或缺的编程管理利器
💻 PHP
📖 第 1 页 / 共 2 页
字号:
 Checks for leap year, returns true if it is. No 2-digit year check. Also 

 handles julian calendar correctly.

*/

function _adodb_is_leap_year($year) 

{

	if ($year % 4 != 0) return false;

	

	if ($year % 400 == 0) {

		return true;

	// if gregorian calendar (>1582), century not-divisible by 400 is not leap

	} else if ($year > 1582 && $year % 100 == 0 ) {

		return false;

	} 

	

	return true;

}



/**

 checks for leap year, returns true if it is. Has 2-digit year check

*/

function adodb_is_leap_year($year) 

{

	return  _adodb_is_leap_year(adodb_year_digit_check($year));

}



/**

	Fix 2-digit years. Works for any century.

 	Assumes that if 2-digit is more than 30 years in future, then previous century.

*/

function adodb_year_digit_check($y) 

{

	if ($y < 100) {

	

		$yr = (integer) date("Y");

		$century = (integer) ($yr /100);

		

		if ($yr%100 > 50) {

			$c1 = $century + 1;

			$c0 = $century;

		} else {

			$c1 = $century;

			$c0 = $century - 1;

		}

		$c1 *= 100;

		// if 2-digit year is less than 30 years in future, set it to this century

		// otherwise if more than 30 years in future, then we set 2-digit year to the prev century.

		if (($y + $c1) < $yr+30) $y = $y + $c1;

		else $y = $y + $c0*100;

	}

	return $y;

}



/**

 get local time zone offset from GMT

*/

function adodb_get_gmt_diff() 

{

static $TZ;

	if (isset($TZ)) return $TZ;

	

	$TZ = mktime(0,0,0,1,2,1970,0) - gmmktime(0,0,0,1,2,1970,0);

	return $TZ;

}



/**

	Returns an array with date info.

*/

function adodb_getdate($d=false,$fast=false)

{

	if ($d === false) return getdate();

	if (!defined('ADODB_TEST_DATES')) {

		if ((abs($d) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range

			if (!defined('ADODB_NO_NEGATIVE_TS') || $d >= 0) // if windows, must be +ve integer

				return @getdate($d);

		}

	}

	return _adodb_getdate($d);

}



/**

	Low-level function that returns the getdate() array. We have a special

	$fast flag, which if set to true, will return fewer array values,

	and is much faster as it does not calculate dow, etc.

*/

function _adodb_getdate($origd=false,$fast=false,$is_gmt=false)

{

	$d =  $origd - ($is_gmt ? 0 : adodb_get_gmt_diff());

	

	$_day_power = 86400;

	$_hour_power = 3600;

	$_min_power = 60;

	

	if ($d < -12219321600) $d -= 86400*10; // if 15 Oct 1582 or earlier, gregorian correction 

	

	$_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31);

	$_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31);

	

	if ($d < 0) {

		$origd = $d;

		// The valid range of a 32bit signed timestamp is typically from 

		// Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT

		for ($a = 1970 ; --$a >= 0;) {

			$lastd = $d;

			

			if ($leaf = _adodb_is_leap_year($a)) {

				$d += $_day_power * 366;

			} else

				$d += $_day_power * 365;

			if ($d >= 0) {

				$year = $a;

				break;

			}

		}

		

		$secsInYear = 86400 * ($leaf ? 366 : 365) + $lastd;

		

		$d = $lastd;

		$mtab = ($leaf) ? $_month_table_leaf : $_month_table_normal;

		for ($a = 13 ; --$a > 0;) {

			$lastd = $d;

			$d += $mtab[$a] * $_day_power;

			if ($d >= 0) {

				$month = $a;

				$ndays = $mtab[$a];

				break;

			}

		}

		

		$d = $lastd;

		$day = $ndays + ceil(($d+1) / ($_day_power));



		$d += ($ndays - $day+1)* $_day_power;

		$hour = floor($d/$_hour_power);

	

	} else {

	

		for ($a = 1970 ;; $a++) {

			$lastd = $d;

			

			if ($leaf = _adodb_is_leap_year($a)) {

				$d -= $_day_power * 366;

			} else

				$d -= $_day_power * 365;

			if ($d < 0) {

				$year = $a;

				break;

			}

		}

		$secsInYear = $lastd;

		$d = $lastd;

		$mtab = ($leaf) ? $_month_table_leaf : $_month_table_normal;

		for ($a = 1 ; $a <= 12; $a++) {

			$lastd = $d;

			$d -= $mtab[$a] * $_day_power;

			if ($d < 0) {

				$month = $a;

				$ndays = $mtab[$a];

				break;

			}

		}

		$d = $lastd;

		$day = ceil(($d+1) / $_day_power);

		$d = $d - ($day-1) * $_day_power;

		$hour = floor($d /$_hour_power);

	}

	

	$d -= $hour * $_hour_power;

	$min = floor($d/$_min_power);

	$secs = $d - $min * $_min_power;

	if ($fast) {

		return array(

		'seconds' => $secs,

		'minutes' => $min,

		'hours' => $hour,

		'mday' => $day,

		'mon' => $month,

		'year' => $year,

		'yday' => floor($secsInYear/$_day_power),

		'leap' => $leaf,

		'ndays' => $ndays

		);

	}

	

	

	$dow = adodb_dow($year,$month,$day);



	return array(

		'seconds' => $secs,

		'minutes' => $min,

		'hours' => $hour,

		'mday' => $day,

		'wday' => $dow,

		'mon' => $month,

		'year' => $year,

		'yday' => floor($secsInYear/$_day_power),

		'weekday' => gmdate('l',$_day_power*(3+$dow)),

		'month' => gmdate('F',mktime(0,0,0,$month,2,1971)),

		0 => $origd

	);

}



function adodb_gmdate($fmt,$d=false)

{

	return adodb_date($fmt,$d,true);

}



function adodb_date2($fmt, $d=false, $is_gmt=false)

{

	if ($d !== false) {

		if (!preg_match( 

			"|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})[ -]?(([0-9]{1,2}):?([0-9]{1,2}):?([0-9\.]{1,4}))?|", 

			($d), $rr)) return adodb_date($fmt,false,$is_gmt);



		if ($rr[1] <= 100 && $rr[2]<= 1) return adodb_date($fmt,false,$is_gmt);

	

		// h-m-s-MM-DD-YY

		if (!isset($rr[5])) $d = adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1]);

		else $d = @adodb_mktime($rr[5],$rr[6],$rr[7],$rr[2],$rr[3],$rr[1]);

	}

	

	return adodb_date($fmt,$d,$is_gmt);

}



/**

	Return formatted date based on timestamp $d

*/

function adodb_date($fmt,$d=false,$is_gmt=false)

{

	if ($d === false) return date($fmt);

	if (!defined('ADODB_TEST_DATES')) {

		if ((abs($d) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range

			if (!defined('ADODB_NO_NEGATIVE_TS') || $d >= 0) // if windows, must be +ve integer

				return @date($fmt,$d);

		}

	}

	$_day_power = 86400;

	

	$arr = _adodb_getdate($d,true,$is_gmt);

	$year = $arr['year'];

	$month = $arr['mon'];

	$day = $arr['mday'];

	$hour = $arr['hours'];

	$min = $arr['minutes'];

	$secs = $arr['seconds'];

	

	$max = strlen($fmt);

	$dates = '';

	

	/*

		at this point, we have the following integer vars to manipulate:

		$year, $month, $day, $hour, $min, $secs

	*/

	for ($i=0; $i < $max; $i++) {

		switch($fmt[$i]) {

		case 'T': $dates .= date('T');break;

		// YEAR

		case 'L': $dates .= $arr['leap'] ? '1' : '0'; break;

		case 'r': // Thu, 21 Dec 2000 16:01:07 +0200

		

			$dates .= gmdate('D',$_day_power*(3+adodb_dow($year,$month,$day))).', '		

				. ($day<10?' '.$day:$day) . ' '.date('M',mktime(0,0,0,$month,2,1971)).' '.$year.' ';

			

			if ($hour < 10) $dates .= '0'.$hour; else $dates .= $hour; 

			

			if ($min < 10) $dates .= ':0'.$min; else $dates .= ':'.$min;

			

			if ($secs < 10) $dates .= ':0'.$secs; else $dates .= ':'.$secs;

			

			$gmt = adodb_get_gmt_diff();

			$dates .= sprintf(' %s%04d',($gmt<0)?'+':'-',abs($gmt)/36); break;

				

		case 'Y': $dates .= $year; break;

		case 'y': $dates .= substr($year,strlen($year)-2,2); break;

		// MONTH

		case 'm': if ($month<10) $dates .= '0'.$month; else $dates .= $month; break;

		case 'Q': $dates .= ($month+3)>>2; break;

		case 'n': $dates .= $month; break;

		case 'M': $dates .= date('M',mktime(0,0,0,$month,2,1971)); break;

		case 'F': $dates .= date('F',mktime(0,0,0,$month,2,1971)); break;

		// DAY

		case 't': $dates .= $arr['ndays']; break;

		case 'z': $dates .= $arr['yday']; break;

		case 'w': $dates .= adodb_dow($year,$month,$day); break;

		case 'l': $dates .= gmdate('l',$_day_power*(3+adodb_dow($year,$month,$day))); break;

		case 'D': $dates .= gmdate('D',$_day_power*(3+adodb_dow($year,$month,$day))); break;

		case 'j': $dates .= $day; break;

		case 'd': if ($day<10) $dates .= '0'.$day; else $dates .= $day; break;

		case 'S': 

			$d10 = $day % 10;

			if ($d10 == 1) $dates .= 'st';

			else if ($d10 == 2) $dates .= 'nd';

			else if ($d10 == 3) $dates .= 'rd';

			else $dates .= 'th';

			break;

			

		// HOUR

		case 'Z':

			$dates .= ($is_gmt) ? 0 : -adodb_get_gmt_diff(); break;

		case 'O': 

			$gmt = ($is_gmt) ? 0 : adodb_get_gmt_diff();

			$dates .= sprintf('%s%04d',($gmt<0)?'+':'-',abs($gmt)/36); break;

			

		case 'H': 

			if ($hour < 10) $dates .= '0'.$hour; 

			else $dates .= $hour; 

			break;

		case 'h': 

			if ($hour > 12) $hh = $hour - 12; 

			else {

				if ($hour == 0) $hh = '12'; 

				else $hh = $hour;

			}

			

			if ($hh < 10) $dates .= '0'.$hh;

			else $dates .= $hh;

			break;

			

		case 'G': 

			$dates .= $hour;

			break;

			

		case 'g':

			if ($hour > 12) $hh = $hour - 12; 

			else {

				if ($hour == 0) $hh = '12'; 

				else $hh = $hour; 

			}

			$dates .= $hh;

			break;

		// MINUTES

		case 'i': if ($min < 10) $dates .= '0'.$min; else $dates .= $min; break;

		// SECONDS

		case 'U': $dates .= $d; break;

		case 's': if ($secs < 10) $dates .= '0'.$secs; else $dates .= $secs; break;

		// AM/PM

		// Note 00:00 to 11:59 is AM, while 12:00 to 23:59 is PM

		case 'a':

			if ($hour>=12) $dates .= 'pm';

			else $dates .= 'am';

			break;

		case 'A':

			if ($hour>=12) $dates .= 'PM';

			else $dates .= 'AM';

			break;

		default:

			$dates .= $fmt[$i]; break;

		// ESCAPE

		case "\\": 

			$i++;

			if ($i < $max) $dates .= $fmt[$i];

			break;

		}

	}

	return $dates;

}



/**

	Returns a timestamp given a GMT/UTC time. 

	Note that $is_dst is not implemented and is ignored.

*/

function adodb_gmmktime($hr,$min,$sec,$mon,$day,$year,$is_dst=false)

{

	return adodb_mktime($hr,$min,$sec,$mon,$day,$year,$is_dst,true);

}



/**

	Return a timestamp given a local time. Originally by jackbbs.

	Note that $is_dst is not implemented and is ignored.

*/

function adodb_mktime($hr,$min,$sec,$mon,$day,$year,$is_dst=false,$is_gmt=false) 

{

	if (!defined('ADODB_TEST_DATES')) {

		// for windows, we don't check 1970 because with timezone differences, 

		// 1 Jan 1970 could generate negative timestamp, which is illegal

		if (!defined('ADODB_NO_NEGATIVE_TS') || ($year >= 1971)) 

			if (1901 < $year && $year < 2038)

				return @mktime($hr,$min,$sec,$mon,$day,$year);

	}

	

	$gmt_different = ($is_gmt) ? 0 : adodb_get_gmt_diff();

	

	$hr = intval($hr);

	$min = intval($min);

	$sec = intval($sec);

	$mon = intval($mon);

	$day = intval($day);

	$year = intval($year);

	

	

	$year = adodb_year_digit_check($year);

	

	if ($mon > 12) {

		$y = floor($mon / 12);

		$year += $y;

		$mon -= $y*12;

	}

	

	$_day_power = 86400;

	$_hour_power = 3600;

	$_min_power = 60;

	

	$_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31);

	$_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31);

	

	$_total_date = 0;

	if ($year >= 1970) {

		for ($a = 1970 ; $a <= $year; $a++) {

			$leaf = _adodb_is_leap_year($a);

			if ($leaf == true) {

				$loop_table = $_month_table_leaf;

				$_add_date = 366;

			} else {

				$loop_table = $_month_table_normal;

				$_add_date = 365;

			}

			if ($a < $year) { 

				$_total_date += $_add_date;

			} else {

				for($b=1;$b<$mon;$b++) {

					$_total_date += $loop_table[$b];

				}

			}

		}

		$_total_date +=$day-1;

		$ret = $_total_date * $_day_power + $hr * $_hour_power + $min * $_min_power + $sec + $gmt_different;

	

	} else {

		for ($a = 1969 ; $a >= $year; $a--) {

			$leaf = _adodb_is_leap_year($a);

			if ($leaf == true) {

				$loop_table = $_month_table_leaf;

				$_add_date = 366;

			} else {

				$loop_table = $_month_table_normal;

				$_add_date = 365;

			}

			if ($a > $year) { $_total_date += $_add_date;

			} else {

				for($b=12;$b>$mon;$b--) {

					$_total_date += $loop_table[$b];

				}

			}

		}

		$_total_date += $loop_table[$mon] - $day;

		

		$_day_time = $hr * $_hour_power + $min * $_min_power + $sec;

		$_day_time = $_day_power - $_day_time;

		$ret = -( $_total_date * $_day_power + $_day_time - $gmt_different);

		if ($ret < -12220185600) $ret += 10*86400; // if earlier than 5 Oct 1582 - gregorian correction

		else if ($ret < -12219321600) $ret = -12219321600; // if in limbo, reset to 15 Oct 1582.

	} 

	//print " dmy=$day/$mon/$year $hr:$min:$sec => " .$ret;

	return $ret;

}



?>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -