400 define(
'ADODB_DATE_VERSION',0.35);
417 if (!defined(
'ADODB_ALLOW_NEGATIVE_TS')) define(
'ADODB_NO_NEGATIVE_TS',1);
421 $h = round(rand()% 24);
424 if ($h == 0) $h =
'00';
425 else if ($h < 10) $h =
'0'.$h;
426 if (
"$y1-$m-$d $h:00:00" != $rez) {
427 print
"<b>$y1 error, expected=$y1-$m-$d $h:00:00, adodb=$rez</b><br>";
435 $s1 = strftime($fmt);
438 if ($s1 == $s2)
return true;
440 echo
"error for $fmt, strftime=$s1, adodb=$s2<br>";
450 for ($m=-24; $m<=24; $m++)
453 error_reporting(E_ALL);
454 print
"<h4>Testing adodb_date and adodb_mktime. version=".ADODB_DATE_VERSION.
' PHP='.PHP_VERSION.
"</h4>";
459 if (!defined(
'ADODB_TEST_DATES')) define(
'ADODB_TEST_DATES',1);
464 $fmt =
'Y-m-d H:i:s';
467 echo
'php : ',date($fmt,$t),
'<br>';
475 if (!(
adodb_date(
'Y-m-d') == date(
'Y-m-d'))) print
'Error in '.adodb_mktime(0,0,0).
'<br>';
478 if (!(
adodb_date(
'Y-m-d',$t) ==
'2102-06-01')) print
'Error in '.adodb_date(
'Y-m-d',$t).
'<br>';
481 if (!(
adodb_date(
'Y-m-d',$t) ==
'2102-02-01')) print
'Error in '.adodb_date(
'Y-m-d',$t).
'<br>';
484 print
"<p>Testing gregorian <=> julian conversion<p>";
487 if (!(
adodb_date(
'D Y-m-d',$t) ==
'Fri 1492-10-11')) print
'Error in Columbus landing<br>';
490 if (!(
adodb_date(
'Y-m-d',$t) ==
'1500-02-29')) print
'Error in julian leap years<br>';
493 if (!(
adodb_date(
'Y-m-d',$t) ==
'1700-03-01')) print
'Error in gregorian leap years<br>';
497 $diff = (
adodb_mktime(0,0,0,10,15,1582) -
adodb_mktime(0,0,0,10,4,1582));
498 if ($diff != 3600*24) print
" <b>Error in gregorian correction = ".($diff/3600/24).
" days </b><br>";
500 print
" 15 Oct 1582, Fri=".(adodb_dow(1582,10,15) == 5 ?
'Fri' :
'<b>Error</b>').
"<br>";
501 print
" 4 Oct 1582, Thu=".(adodb_dow(1582,10,4) == 4 ?
'Thu' :
'<b>Error</b>').
"<br>";
503 print
"<p>Testing overflow<p>";
506 if (!(
adodb_date(
'Y-m-d',$t) ==
'1965-04-02')) print
'Error in day overflow 1 <br>';
508 if (!(
adodb_date(
'Y-m-d',$t) ==
'1971-05-03')) print
'Error in day overflow 2 <br>';
510 if (!(
adodb_date(
'Y-m-d',$t) ==
'1965-03-01')) print
'Error in day overflow 3 '.adodb_date(
'Y-m-d',$t).
' <br>';
512 if (!(
adodb_date(
'Y-m-d',$t) ==
'1966-01-01')) print
'Error in day overflow 4 '.adodb_date(
'Y-m-d',$t).
' <br>';
514 if (!(
adodb_date(
'Y-m-d',$t) ==
'1966-02-01')) print
'Error in day overflow 5 '.adodb_date(
'Y-m-d',$t).
' <br>';
516 if (!(
adodb_date(
'Y-m-d',$t) ==
'1966-01-03')) print
'Error in mth overflow 1 <br>';
518 print
"Testing 2-digit => 4-digit year conversion<p>";
528 print
"<p>Testing date formating</p>";
530 $fmt =
'\d\a\t\e T Y-m-d H:i:s a A d D F g G h H i j l L m M n O \R\F\C2822 r s t U w y Y z Z 2003';
534 print
" date() 0 failed<br>$s1<br>$s2<br>";
537 for ($i=100; --$i > 0; ) {
539 $ts = 3600.0*((rand()%60000)+(rand()%60000))+(rand()%60000);
540 $s1 = date($fmt,$ts);
543 $pos = strcmp($s1,$s2);
545 if (($s1) != ($s2)) {
546 for ($j=0,$k=strlen($s1); $j < $k; $j++) {
547 if ($s1[$j] != $s2[$j]) {
548 print substr($s1,$j).
' ';
552 print
"<b>Error date(): $ts<br><pre> 553 \"$s1\" (date len=".strlen($s1).
") 554 \"$s2\" (adodb_date len=".strlen($s2).
")</b></pre><br>";
560 $rez = array_diff($a1,$a2);
561 if (
sizeof($rez)>0) {
562 print
"<b>Error getdate() $ts</b><br>";
572 print
"<p>Testing random dates between 100 and 4000</p>";
574 for ($i=100; --$i >= 0;) {
575 $y1 = 100+rand(0,1970-100);
579 $y1 = 3000-rand(0,3000-1970);
583 $start = 1960+rand(0,10);
585 $i = 365.25*86400*($start-1970);
586 $offset = 36000+rand(10000,60000);
587 $max = 365*$yrs*86400;
592 print
"Testing $start to ".($start+$yrs).
", or $max seconds, offset=$offset: ";
594 for ($max += $i; $i < $max; $i += $offset) {
596 $arr = explode(
',',$ret);
597 if ($lastyear != $arr[2]) {
602 $newi =
adodb_mktime($arr[3],$arr[4],$arr[5],$arr[0],$arr[1],$arr[2]);
604 print
"Error at $i, adodb_mktime returned $newi ($ret)";
610 echo
"Tested $cnt dates<br>";
611 if (!$fail) print
"<p>Passed !</p>";
612 else print
"<p><b>Failed</b> :-(</p>";
618 return $d->format(
'U');
636 ($year == 1582 && ($month < 10 || ($month == 10 && $day < 15)))) $greg_correction = 3;
638 $greg_correction = 0;
640 $greg_correction = 0;
649 $day = floor((13 * $month - 1) / 5) +
650 $day + ($year % 100) +
651 floor(($year % 100) / 4) +
652 floor(($year / 100) / 4) - 2 *
653 floor($year / 100) + 77 + $greg_correction;
655 return $day - 7 * floor($day / 7);
665 if ($year % 4 != 0)
return false;
667 if ($year % 400 == 0) {
670 }
else if ($year > 1582 && $year % 100 == 0 ) {
694 $yr = (integer) date(
"Y");
695 $century = (integer) ($yr /100);
707 if (($y + $c1) < $yr+30) $y = $y + $c1;
708 else $y = $y + $c0*100;
715 if (0 <= $ts && $ts <= 0x7FFFFFFF) {
735 if (!defined(
'ADODB_TEST_DATES')) $y =
false;
736 else if ($y < 1970 || $y >= 2038) $y =
false;
738 if ($ADODB_DATETIME_CLASS && $y !==
false) {
739 $dt =
new DateTime();
740 $dt->setISODate($y,$m,$d);
742 $tzo =
new DateTimeZone(date_default_timezone_get());
743 # $tzt = timezone_transitions_get( $tzo ); 745 return -$tzo->getOffset($dt);
747 if (isset($TZ))
return $TZ;
758 if (empty($TZ)) $TZ = mktime(0,0,0,12,2,$y) - gmmktime(0,0,0,12,2,$y);
768 if ($d ===
false)
return getdate();
769 if (!defined(
'ADODB_TEST_DATES')) {
770 if ((abs($d) <= 0x7FFFFFFF)) {
771 if (!defined(
'ADODB_NO_NEGATIVE_TS') || $d >= 0)
799 $_month_table_normal = array(
"",31,28,31,30,31,30,31,31,30,31,30,31);
800 $_month_table_leaf = array(
"",31,29,31,30,31,30,31,31,30,31,30,31);
809 if ($m > 12 || $m < 1)
return false;
811 if ($d > 31 || $d < 1)
return false;
813 if ($marr[$m] < $d)
return false;
815 if ($y < 1000 && $y > 3000)
return false;
835 if ($d < -12219321600) $d -= 86400*10;
837 $_month_table_normal = array(
"",31,28,31,30,31,30,31,31,30,31,30,31);
838 $_month_table_leaf = array(
"",31,29,31,30,31,30,31,31,30,31,30,31);
840 $d366 = $_day_power * 366;
841 $d365 = $_day_power * 365;
845 if (empty($YRS)) $YRS = array(
878 1650 => -10098172800,
879 1640 => -10413792000,
880 1630 => -10729324800,
881 1620 => -11044944000,
882 1610 => -11360476800,
883 1600 => -11676096000);
885 if ($is_gmt) $origd = $d;
890 # old algorithm iterates through all years. new algorithm does it in 910 foreach($YRS as $year => $secs) {
920 if (!isset($a)) $a = $lastyear;
937 $secsInYear = 86400 * ($leaf ? 366 : 365) + $lastd;
940 $mtab = ($leaf) ? $_month_table_leaf : $_month_table_normal;
941 for ($a = 13 ; --$a > 0;) {
943 $d += $mtab[$a] * $_day_power;
952 $day = $ndays + ceil(($d+1) / ($_day_power));
954 $d += ($ndays - $day+1)* $_day_power;
955 $hour = floor($d/$_hour_power);
958 for ($a = 1970 ;; $a++) {
968 $secsInYear = $lastd;
970 $mtab = ($leaf) ? $_month_table_leaf : $_month_table_normal;
971 for ($a = 1 ; $a <= 12; $a++) {
973 $d -= $mtab[$a] * $_day_power;
981 $day = ceil(($d+1) / $_day_power);
982 $d = $d - ($day-1) * $_day_power;
983 $hour = floor($d /$_hour_power);
986 $d -= $hour * $_hour_power;
987 $min = floor($d/$_min_power);
988 $secs = $d - $min * $_min_power;
997 'yday' => floor($secsInYear/$_day_power),
1014 'yday' => floor($secsInYear/$_day_power),
1015 'weekday' => gmdate(
'l',$_day_power*(3+$dow)),
1016 'month' => gmdate(
'F',mktime(0,0,0,$month,2,1971)),
1028 $zhrs = abs($gmt)/3600;
1029 $hrs = floor($zhrs);
1031 return sprintf(
'%s%02d%02d',($gmt<=0)?
'+':
'-',floor($zhrs),($zhrs-$hrs)*60);
1033 return sprintf(
'%s%02d%02d',($gmt<0)?
'+':
'-',floor($zhrs),($zhrs-$hrs)*60);
1047 "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})[ -]?(([0-9]{1,2}):?([0-9]{1,2}):?([0-9\.]{1,4}))?|",
1048 ($d), $rr))
return adodb_date($fmt,
false,$is_gmt);
1050 if ($rr[1] <= 100 && $rr[2]<= 1)
return adodb_date($fmt,
false,$is_gmt);
1053 if (!isset($rr[5])) $d =
adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1],
false,$is_gmt);
1054 else $d = @
adodb_mktime($rr[5],$rr[6],$rr[7],$rr[2],$rr[3],$rr[1],
false,$is_gmt);
1071 if (!isset($daylight)) {
1072 $daylight = function_exists(
'adodb_daylight_sv');
1073 if (empty($jan1_1971)) $jan1_1971 = mktime(0,0,0,1,1,1971);
1076 if ($d ===
false)
return ($is_gmt)? @gmdate($fmt): @date($fmt);
1077 if (!defined(
'ADODB_TEST_DATES')) {
1078 if ((abs($d) <= 0x7FFFFFFF)) {
1080 if (!defined(
'ADODB_NO_NEGATIVE_TS') || $d >= $jan1_1971)
1081 return ($is_gmt)? @gmdate($fmt,$d): @date($fmt,$d);
1085 $_day_power = 86400;
1089 if ($daylight) adodb_daylight_sv($arr, $is_gmt);
1091 $year = $arr[
'year'];
1092 $month = $arr[
'mon'];
1093 $day = $arr[
'mday'];
1094 $hour = $arr[
'hours'];
1095 $min = $arr[
'minutes'];
1096 $secs = $arr[
'seconds'];
1098 $max = strlen($fmt);
1101 $isphp5 = PHP_VERSION >= 5;
1107 for ($i=0; $i < $max; $i++) {
1110 $dates .= date(
'e');
1113 if ($ADODB_DATETIME_CLASS) {
1114 $dt =
new DateTime();
1115 $dt->SetDate($year,$month,$day);
1116 $dates .= $dt->Format(
'T');
1118 $dates .= date(
'T');
1121 case 'L': $dates .= $arr[
'leap'] ?
'1' :
'0';
break;
1126 $dates .= gmdate(
'D',$_day_power*(3+
adodb_dow($year,$month,$day))).
', ' 1127 . ($day<10?
'0'.$day:$day) .
' '.date(
'M',mktime(0,0,0,$month,2,1971)).
' '.$year.
' ';
1129 if ($hour < 10) $dates .=
'0'.$hour;
else $dates .= $hour;
1131 if ($min < 10) $dates .=
':0'.$min;
else $dates .=
':'.$min;
1133 if ($secs < 10) $dates .=
':0'.$secs;
else $dates .=
':'.$secs;
1137 $dates .=
' '.adodb_tz_offset($gmt,$isphp5);
1140 case 'Y': $dates .= $year;
break;
1141 case 'y': $dates .= substr($year,strlen($year)-2,2);
break;
1143 case 'm':
if ($month<10) $dates .=
'0'.$month;
else $dates .= $month;
break;
1144 case 'Q': $dates .= ($month+3)>>2;
break;
1145 case 'n': $dates .= $month;
break;
1146 case 'M': $dates .= date(
'M',mktime(0,0,0,$month,2,1971));
break;
1147 case 'F': $dates .= date(
'F',mktime(0,0,0,$month,2,1971));
break;
1149 case 't': $dates .= $arr[
'ndays'];
break;
1150 case 'z': $dates .= $arr[
'yday'];
break;
1151 case 'w': $dates .=
adodb_dow($year,$month,$day);
break;
1152 case 'l': $dates .= gmdate(
'l',$_day_power*(3+
adodb_dow($year,$month,$day)));
break;
1153 case 'D': $dates .= gmdate(
'D',$_day_power*(3+
adodb_dow($year,$month,$day)));
break;
1154 case 'j': $dates .= $day;
break;
1155 case 'd':
if ($day<10) $dates .=
'0'.$day;
else $dates .= $day;
break;
1158 if ($d10 == 1) $dates .=
'st';
1159 else if ($d10 == 2 && $day != 12) $dates .=
'nd';
1160 else if ($d10 == 3) $dates .=
'rd';
1161 else $dates .=
'th';
1174 if ($hour < 10) $dates .=
'0'.$hour;
1175 else $dates .= $hour;
1178 if ($hour > 12) $hh = $hour - 12;
1180 if ($hour == 0) $hh =
'12';
1184 if ($hh < 10) $dates .=
'0'.$hh;
1193 if ($hour > 12) $hh = $hour - 12;
1195 if ($hour == 0) $hh =
'12';
1201 case 'i':
if ($min < 10) $dates .=
'0'.$min;
else $dates .= $min;
break;
1203 case 'U': $dates .= $d;
break;
1204 case 's':
if ($secs < 10) $dates .=
'0'.$secs;
else $dates .= $secs;
break;
1208 if ($hour>=12) $dates .=
'pm';
1209 else $dates .=
'am';
1212 if ($hour>=12) $dates .=
'PM';
1213 else $dates .=
'AM';
1216 $dates .= $fmt[$i];
break;
1220 if ($i < $max) $dates .= $fmt[$i];
1231 function adodb_gmmktime($hr,$min,$sec,$mon=
false,$day=
false,$year=
false,$is_dst=
false)
1233 return adodb_mktime($hr,$min,$sec,$mon,$day,$year,$is_dst,
true);
1242 function adodb_mktime($hr,$min,$sec,$mon=
false,$day=
false,$year=
false,$is_dst=
false,$is_gmt=
false)
1244 if (!defined(
'ADODB_TEST_DATES')) {
1246 if ($mon ===
false) {
1247 return $is_gmt? @gmmktime($hr,$min,$sec): @mktime($hr,$min,$sec);
1252 $usephpfns = (1970 < $year && $year < 2038
1253 || !defined(
'ADODB_NO_NEGATIVE_TS') && (1901 < $year && $year < 2038)
1257 if ($usephpfns && ($year + $mon/12+$day/365.25+$hr/(24*365.25) >= 2038)) $usephpfns =
false;
1261 @gmmktime($hr,$min,$sec,$mon,$day,$year):
1262 @mktime($hr,$min,$sec,$mon,$day,$year);
1275 $mon = intval($mon);
1276 $day = intval($day);
1277 $year = intval($year);
1283 $y = floor(($mon-1)/ 12);
1286 }
else if ($mon < 1) {
1287 $y = ceil((1-$mon) / 12);
1292 $_day_power = 86400;
1293 $_hour_power = 3600;
1296 $_month_table_normal = array(
"",31,28,31,30,31,30,31,31,30,31,30,31);
1297 $_month_table_leaf = array(
"",31,29,31,30,31,30,31,31,30,31,30,31);
1300 if ($year >= 1970) {
1301 for ($a = 1970 ; $a <= $year; $a++) {
1303 if ($leaf ==
true) {
1311 $_total_date += $_add_date;
1313 for($b=1;$b<$mon;$b++) {
1314 $_total_date += $loop_table[$b];
1318 $_total_date +=$day-1;
1319 $ret = $_total_date * $_day_power + $hr * $_hour_power + $min * $_min_power + $sec + $gmt_different;
1322 for ($a = 1969 ; $a >= $year; $a--) {
1324 if ($leaf ==
true) {
1331 if ($a > $year) { $_total_date += $_add_date;
1333 for($b=12;$b>$mon;$b--) {
1334 $_total_date += $loop_table[$b];
1338 $_total_date += $loop_table[$mon] - $day;
1340 $_day_time = $hr * $_hour_power + $min * $_min_power + $sec;
1341 $_day_time = $_day_power - $_day_time;
1342 $ret = -( $_total_date * $_day_power + $_day_time - $gmt_different);
1343 if ($ret < -12220185600) $ret += 10*86400;
1344 else if ($ret < -12219321600) $ret = -12219321600;
1358 global $ADODB_DATE_LOCALE;
1360 if (!defined(
'ADODB_TEST_DATES')) {
1361 if ((abs($ts) <= 0x7FFFFFFF)) {
1362 if (!defined(
'ADODB_NO_NEGATIVE_TS') || $ts >= 0)
1363 return ($is_gmt)? @gmstrftime($fmt,$ts): @strftime($fmt,$ts);
1368 if (empty($ADODB_DATE_LOCALE)) {
1374 # see http://phplens.com/lens/lensforum/msgs.php?id=14865 for reasoning, and changelog for version 0.24 1375 $dstr = gmstrftime(
'%x',31366800);
1376 $sep = substr($dstr,2,1);
1377 $tstr = strtoupper(gmstrftime(
'%X',31366800));
1378 $hasAM = strrpos($tstr,
'M') !==
false;
1380 $ADODB_DATE_LOCALE = array();
1381 $ADODB_DATE_LOCALE[] = strncmp($tstr,
'30',2) == 0 ?
'd'.$sep.
'm'.
$sep.
'y' :
'm'.$sep.
'd'.
$sep.
'y';
1382 $ADODB_DATE_LOCALE[] = ($hasAM) ?
'h:i:s a' :
'H:i:s';
1387 for ($i=0,$max = strlen($fmt); $i < $max; $i++) {
1395 }
else if ($inpct) {
1415 case 'a': $fmtdate .=
'D';
break;
1416 case 'A': $fmtdate .=
'l';
break;
1418 case 'b': $fmtdate .=
'M';
break;
1419 case 'B': $fmtdate .=
'F';
break;
1420 case 'c': $fmtdate .= $ADODB_DATE_LOCALE[0].$ADODB_DATE_LOCALE[1];
break;
1421 case 'C': $fmtdate .=
'\C?';
break;
1422 case 'd': $fmtdate .=
'd';
break;
1423 case 'D': $fmtdate .=
'm/d/y';
break;
1424 case 'e': $fmtdate .=
'j';
break;
1425 case 'g': $fmtdate .=
'\g?';
break;
1426 case 'G': $fmtdate .=
'\G?';
break;
1427 case 'H': $fmtdate .=
'H';
break;
1428 case 'I': $fmtdate .=
'h';
break;
1429 case 'j': $fmtdate .=
'?z'; $parsej =
true;
break;
1430 case 'm': $fmtdate .=
'm';
break;
1431 case 'M': $fmtdate .=
'i';
break;
1432 case 'n': $fmtdate .=
"\n";
break;
1433 case 'p': $fmtdate .=
'a';
break;
1434 case 'r': $fmtdate .=
'h:i:s a';
break;
1435 case 'R': $fmtdate .=
'H:i:s';
break;
1436 case 'S': $fmtdate .=
's';
break;
1437 case 't': $fmtdate .=
"\t";
break;
1438 case 'T': $fmtdate .=
'H:i:s';
break;
1439 case 'u': $fmtdate .=
'?u'; $parseu =
true;
break;
1440 case 'U': $fmtdate .=
'?U'; $parseU =
true;
break;
1441 case 'x': $fmtdate .= $ADODB_DATE_LOCALE[0];
break;
1442 case 'X': $fmtdate .= $ADODB_DATE_LOCALE[1];
break;
1443 case 'w': $fmtdate .=
'?w'; $parseu =
true;
break;
1444 case 'W': $fmtdate .=
'?W'; $parseU =
true;
break;
1445 case 'y': $fmtdate .=
'y';
break;
1446 case 'Y': $fmtdate .=
'Y';
break;
1447 case 'Z': $fmtdate .=
'T';
break;
1449 }
else if ((
'A' <= ($ch) && ($ch) <=
'Z' ) || (
'a' <= ($ch) && ($ch) <=
'z' ))
1450 $fmtdate .=
"\\".$ch;
1455 if ($ts ===
false) $ts = time();
adodb_get_gmt_diff($y, $m, $d)
adodb_date_test_date($y1, $m, $d=13)
adodb_is_leap_year($year)
adodb_gmmktime($hr, $min, $sec, $mon=false, $day=false, $year=false, $is_dst=false)
adodb_dow($year, $month, $day)
adodb_tz_offset($gmt, $isphp5)
adodb_gmdate($fmt, $d=false)
adodb_date($fmt, $d=false, $is_gmt=false)
adodb_gmstrftime($fmt, $ts=false)
adodb_get_gmt_diff_ts($ts)
adodb_date2($fmt, $d=false, $is_gmt=false)
adodb_validdate($y, $m, $d)
adodb_date_test_strftime($fmt)
adodb_getdate($d=false, $fast=false)
adodb_mktime($hr, $min, $sec, $mon=false, $day=false, $year=false, $is_dst=false, $is_gmt=false)
_adodb_is_leap_year($year)
_adodb_getdate($origd=false, $fast=false, $is_gmt=false)
if(!defined( 'ADODB_ALLOW_NEGATIVE_TS')) define( 'ADODB_NO_NEGATIVE_TS'
adodb_strftime($fmt, $ts=false, $is_gmt=false)
adodb_year_digit_check($y)