00001 <?php
00363
00364
00365
00366
00367
00368 define('ADODB_DATE_VERSION',0.23);
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383 if (!defined('ADODB_ALLOW_NEGATIVE_TS')) define('ADODB_NO_NEGATIVE_TS',1);
00384
00385 function adodb_date_test_date($y1,$m,$d=13)
00386 {
00387 $t = adodb_mktime(0,0,0,$m,$d,$y1);
00388 $rez = adodb_date('Y-n-j H:i:s',$t);
00389 if ("$y1-$m-$d 00:00:00" != $rez) {
00390 print "<b>$y1 error, expected=$y1-$m-$d 00:00:00, adodb=$rez</b><br>";
00391 return false;
00392 }
00393 return true;
00394 }
00395
00396 function adodb_date_test_strftime($fmt)
00397 {
00398 $s1 = strftime($fmt);
00399 $s2 = adodb_strftime($fmt);
00400
00401 if ($s1 == $s2) return true;
00402
00403 echo "error for $fmt, strftime=$s1, $adodb=$s2<br>";
00404 return false;
00405 }
00406
00410 function adodb_date_test()
00411 {
00412
00413 error_reporting(E_ALL);
00414 print "<h4>Testing adodb_date and adodb_mktime. version=".ADODB_DATE_VERSION.' PHP='.PHP_VERSION."</h4>";
00415 @set_time_limit(0);
00416 $fail = false;
00417
00418
00419 if (!defined('ADODB_TEST_DATES')) define('ADODB_TEST_DATES',1);
00420
00421 adodb_date_test_strftime('%Y %m %x %X');
00422 adodb_date_test_strftime("%A %d %B %Y");
00423 adodb_date_test_strftime("%H %M S");
00424
00425 $t = adodb_mktime(0,0,0);
00426 if (!(adodb_date('Y-m-d') == date('Y-m-d'))) print 'Error in '.adodb_mktime(0,0,0).'<br>';
00427
00428 $t = adodb_mktime(0,0,0,6,1,2102);
00429 if (!(adodb_date('Y-m-d',$t) == '2102-06-01')) print 'Error in '.adodb_date('Y-m-d',$t).'<br>';
00430
00431 $t = adodb_mktime(0,0,0,2,1,2102);
00432 if (!(adodb_date('Y-m-d',$t) == '2102-02-01')) print 'Error in '.adodb_date('Y-m-d',$t).'<br>';
00433
00434
00435 print "<p>Testing gregorian <=> julian conversion<p>";
00436 $t = adodb_mktime(0,0,0,10,11,1492);
00437
00438 if (!(adodb_date('D Y-m-d',$t) == 'Fri 1492-10-11')) print 'Error in Columbus landing<br>';
00439
00440 $t = adodb_mktime(0,0,0,2,29,1500);
00441 if (!(adodb_date('Y-m-d',$t) == '1500-02-29')) print 'Error in julian leap years<br>';
00442
00443 $t = adodb_mktime(0,0,0,2,29,1700);
00444 if (!(adodb_date('Y-m-d',$t) == '1700-03-01')) print 'Error in gregorian leap years<br>';
00445
00446 print adodb_mktime(0,0,0,10,4,1582).' ';
00447 print adodb_mktime(0,0,0,10,15,1582);
00448 $diff = (adodb_mktime(0,0,0,10,15,1582) - adodb_mktime(0,0,0,10,4,1582));
00449 if ($diff != 3600*24) print " <b>Error in gregorian correction = ".($diff/3600/24)." days </b><br>";
00450
00451 print " 15 Oct 1582, Fri=".(adodb_dow(1582,10,15) == 5 ? 'Fri' : '<b>Error</b>')."<br>";
00452 print " 4 Oct 1582, Thu=".(adodb_dow(1582,10,4) == 4 ? 'Thu' : '<b>Error</b>')."<br>";
00453
00454 print "<p>Testing overflow<p>";
00455
00456 $t = adodb_mktime(0,0,0,3,33,1965);
00457 if (!(adodb_date('Y-m-d',$t) == '1965-04-02')) print 'Error in day overflow 1 <br>';
00458 $t = adodb_mktime(0,0,0,4,33,1971);
00459 if (!(adodb_date('Y-m-d',$t) == '1971-05-03')) print 'Error in day overflow 2 <br>';
00460 $t = adodb_mktime(0,0,0,1,60,1965);
00461 if (!(adodb_date('Y-m-d',$t) == '1965-03-01')) print 'Error in day overflow 3 '.adodb_date('Y-m-d',$t).' <br>';
00462 $t = adodb_mktime(0,0,0,12,32,1965);
00463 if (!(adodb_date('Y-m-d',$t) == '1966-01-01')) print 'Error in day overflow 4 '.adodb_date('Y-m-d',$t).' <br>';
00464 $t = adodb_mktime(0,0,0,12,63,1965);
00465 if (!(adodb_date('Y-m-d',$t) == '1966-02-01')) print 'Error in day overflow 5 '.adodb_date('Y-m-d',$t).' <br>';
00466 $t = adodb_mktime(0,0,0,13,3,1965);
00467 if (!(adodb_date('Y-m-d',$t) == '1966-01-03')) print 'Error in mth overflow 1 <br>';
00468
00469 print "Testing 2-digit => 4-digit year conversion<p>";
00470 if (adodb_year_digit_check(00) != 2000) print "Err 2-digit 2000<br>";
00471 if (adodb_year_digit_check(10) != 2010) print "Err 2-digit 2010<br>";
00472 if (adodb_year_digit_check(20) != 2020) print "Err 2-digit 2020<br>";
00473 if (adodb_year_digit_check(30) != 2030) print "Err 2-digit 2030<br>";
00474 if (adodb_year_digit_check(40) != 1940) print "Err 2-digit 1940<br>";
00475 if (adodb_year_digit_check(50) != 1950) print "Err 2-digit 1950<br>";
00476 if (adodb_year_digit_check(90) != 1990) print "Err 2-digit 1990<br>";
00477
00478
00479 print "<p>Testing date formating</p>";
00480 $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';
00481 $s1 = date($fmt,0);
00482 $s2 = adodb_date($fmt,0);
00483 if ($s1 != $s2) {
00484 print " date() 0 failed<br>$s1<br>$s2<br>";
00485 }
00486 flush();
00487 for ($i=100; --$i > 0; ) {
00488
00489 $ts = 3600.0*((rand()%60000)+(rand()%60000))+(rand()%60000);
00490 $s1 = date($fmt,$ts);
00491 $s2 = adodb_date($fmt,$ts);
00492
00493 $pos = strcmp($s1,$s2);
00494
00495 if (($s1) != ($s2)) {
00496 for ($j=0,$k=strlen($s1); $j < $k; $j++) {
00497 if ($s1[$j] != $s2[$j]) {
00498 print substr($s1,$j).' ';
00499 break;
00500 }
00501 }
00502 print "<b>Error date(): $ts<br><pre>
00503 \"$s1\" (date len=".strlen($s1).")
00504 \"$s2\" (adodb_date len=".strlen($s2).")</b></pre><br>";
00505 $fail = true;
00506 }
00507
00508 $a1 = getdate($ts);
00509 $a2 = adodb_getdate($ts);
00510 $rez = array_diff($a1,$a2);
00511 if (sizeof($rez)>0) {
00512 print "<b>Error getdate() $ts</b><br>";
00513 print_r($a1);
00514 print "<br>";
00515 print_r($a2);
00516 print "<p>";
00517 $fail = true;
00518 }
00519 }
00520
00521
00522 print "<p>Testing random dates between 100 and 4000</p>";
00523 adodb_date_test_date(100,1);
00524 for ($i=100; --$i >= 0;) {
00525 $y1 = 100+rand(0,1970-100);
00526 $m = rand(1,12);
00527 adodb_date_test_date($y1,$m);
00528
00529 $y1 = 3000-rand(0,3000-1970);
00530 adodb_date_test_date($y1,$m);
00531 }
00532 print '<p>';
00533 $start = 1960+rand(0,10);
00534 $yrs = 12;
00535 $i = 365.25*86400*($start-1970);
00536 $offset = 36000+rand(10000,60000);
00537 $max = 365*$yrs*86400;
00538 $lastyear = 0;
00539
00540
00541
00542 print "Testing $start to ".($start+$yrs).", or $max seconds, offset=$offset: ";
00543 $cnt = 0;
00544 for ($max += $i; $i < $max; $i += $offset) {
00545 $ret = adodb_date('m,d,Y,H,i,s',$i);
00546 $arr = explode(',',$ret);
00547 if ($lastyear != $arr[2]) {
00548 $lastyear = $arr[2];
00549 print " $lastyear ";
00550 flush();
00551 }
00552 $newi = adodb_mktime($arr[3],$arr[4],$arr[5],$arr[0],$arr[1],$arr[2]);
00553 if ($i != $newi) {
00554 print "Error at $i, adodb_mktime returned $newi ($ret)";
00555 $fail = true;
00556 break;
00557 }
00558 $cnt += 1;
00559 }
00560 echo "Tested $cnt dates<br>";
00561 if (!$fail) print "<p>Passed !</p>";
00562 else print "<p><b>Failed</b> :-(</p>";
00563 }
00564
00569 function adodb_dow($year, $month, $day)
00570 {
00571
00572
00573
00574
00575
00576
00577
00578 if ($year <= 1582) {
00579 if ($year < 1582 ||
00580 ($year == 1582 && ($month < 10 || ($month == 10 && $day < 15)))) $greg_correction = 3;
00581 else
00582 $greg_correction = 0;
00583 } else
00584 $greg_correction = 0;
00585
00586 if($month > 2)
00587 $month -= 2;
00588 else {
00589 $month += 10;
00590 $year--;
00591 }
00592
00593 $day = floor((13 * $month - 1) / 5) +
00594 $day + ($year % 100) +
00595 floor(($year % 100) / 4) +
00596 floor(($year / 100) / 4) - 2 *
00597 floor($year / 100) + 77 + $greg_correction;
00598
00599 return $day - 7 * floor($day / 7);
00600 }
00601
00602
00607 function _adodb_is_leap_year($year)
00608 {
00609 if ($year % 4 != 0) return false;
00610
00611 if ($year % 400 == 0) {
00612 return true;
00613
00614 } else if ($year > 1582 && $year % 100 == 0 ) {
00615 return false;
00616 }
00617
00618 return true;
00619 }
00620
00621
00625 function adodb_is_leap_year($year)
00626 {
00627 return _adodb_is_leap_year(adodb_year_digit_check($year));
00628 }
00629
00634 function adodb_year_digit_check($y)
00635 {
00636 if ($y < 100) {
00637
00638 $yr = (integer) date("Y");
00639 $century = (integer) ($yr /100);
00640
00641 if ($yr%100 > 50) {
00642 $c1 = $century + 1;
00643 $c0 = $century;
00644 } else {
00645 $c1 = $century;
00646 $c0 = $century - 1;
00647 }
00648 $c1 *= 100;
00649
00650
00651 if (($y + $c1) < $yr+30) $y = $y + $c1;
00652 else $y = $y + $c0*100;
00653 }
00654 return $y;
00655 }
00656
00660 function adodb_get_gmt_diff()
00661 {
00662 static $TZ;
00663 if (isset($TZ)) return $TZ;
00664
00665 $TZ = mktime(0,0,0,1,2,1970,0) - gmmktime(0,0,0,1,2,1970,0);
00666 return $TZ;
00667 }
00668
00672 function adodb_getdate($d=false,$fast=false)
00673 {
00674 if ($d === false) return getdate();
00675 if (!defined('ADODB_TEST_DATES')) {
00676 if ((abs($d) <= 0x7FFFFFFF)) {
00677 if (!defined('ADODB_NO_NEGATIVE_TS') || $d >= 0)
00678 return @getdate($d);
00679 }
00680 }
00681 return _adodb_getdate($d);
00682 }
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705 $_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31);
00706 $_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31);
00707
00708 function adodb_validdate($y,$m,$d)
00709 {
00710 global $_month_table_normal,$_month_table_leaf;
00711
00712 if (_adodb_is_leap_year($y)) $marr =& $_month_table_leaf;
00713 else $marr =& $_month_table_normal;
00714
00715 if ($m > 12 || $m < 1) return false;
00716
00717 if ($d > 31 || $d < 1) return false;
00718
00719 if ($marr[$m] < $d) return false;
00720
00721 if ($y < 1000 && $y > 3000) return false;
00722
00723 return true;
00724 }
00725
00731 function _adodb_getdate($origd=false,$fast=false,$is_gmt=false)
00732 {
00733 static $YRS;
00734 global $_month_table_normal,$_month_table_leaf;
00735
00736 $d = $origd - ($is_gmt ? 0 : adodb_get_gmt_diff());
00737
00738 $_day_power = 86400;
00739 $_hour_power = 3600;
00740 $_min_power = 60;
00741
00742 if ($d < -12219321600) $d -= 86400*10;
00743
00744 $_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31);
00745 $_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31);
00746
00747 $d366 = $_day_power * 366;
00748 $d365 = $_day_power * 365;
00749
00750 if ($d < 0) {
00751
00752 if (empty($YRS)) $YRS = array(
00753 1970 => 0,
00754 1960 => -315619200,
00755 1950 => -631152000,
00756 1940 => -946771200,
00757 1930 => -1262304000,
00758 1920 => -1577923200,
00759 1910 => -1893456000,
00760 1900 => -2208988800,
00761 1890 => -2524521600,
00762 1880 => -2840140800,
00763 1870 => -3155673600,
00764 1860 => -3471292800,
00765 1850 => -3786825600,
00766 1840 => -4102444800,
00767 1830 => -4417977600,
00768 1820 => -4733596800,
00769 1810 => -5049129600,
00770 1800 => -5364662400,
00771 1790 => -5680195200,
00772 1780 => -5995814400,
00773 1770 => -6311347200,
00774 1760 => -6626966400,
00775 1750 => -6942499200,
00776 1740 => -7258118400,
00777 1730 => -7573651200,
00778 1720 => -7889270400,
00779 1710 => -8204803200,
00780 1700 => -8520336000,
00781 1690 => -8835868800,
00782 1680 => -9151488000,
00783 1670 => -9467020800,
00784 1660 => -9782640000,
00785 1650 => -10098172800,
00786 1640 => -10413792000,
00787 1630 => -10729324800,
00788 1620 => -11044944000,
00789 1610 => -11360476800,
00790 1600 => -11676096000);
00791
00792 if ($is_gmt) $origd = $d;
00793
00794
00795
00796
00797 # old algorithm iterates through all years. new algorithm does it in
00798 # 10 year blocks
00799
00800
00801
00802
00803
00804
00805
00806
00807
00808
00809
00810
00811
00812
00813
00814
00815 $lastsecs = 0;
00816 $lastyear = 1970;
00817 foreach($YRS as $year => $secs) {
00818 if ($d >= $secs) {
00819 $a = $lastyear;
00820 break;
00821 }
00822 $lastsecs = $secs;
00823 $lastyear = $year;
00824 }
00825
00826 $d -= $lastsecs;
00827 if (!isset($a)) $a = $lastyear;
00828
00829
00830
00831 for (; --$a >= 0;) {
00832 $lastd = $d;
00833
00834 if ($leaf = _adodb_is_leap_year($a)) $d += $d366;
00835 else $d += $d365;
00836
00837 if ($d >= 0) {
00838 $year = $a;
00839 break;
00840 }
00841 }
00842
00843
00844 $secsInYear = 86400 * ($leaf ? 366 : 365) + $lastd;
00845
00846 $d = $lastd;
00847 $mtab = ($leaf) ? $_month_table_leaf : $_month_table_normal;
00848 for ($a = 13 ; --$a > 0;) {
00849 $lastd = $d;
00850 $d += $mtab[$a] * $_day_power;
00851 if ($d >= 0) {
00852 $month = $a;
00853 $ndays = $mtab[$a];
00854 break;
00855 }
00856 }
00857
00858 $d = $lastd;
00859 $day = $ndays + ceil(($d+1) / ($_day_power));
00860
00861 $d += ($ndays - $day+1)* $_day_power;
00862 $hour = floor($d/$_hour_power);
00863
00864 } else {
00865 for ($a = 1970 ;; $a++) {
00866 $lastd = $d;
00867
00868 if ($leaf = _adodb_is_leap_year($a)) $d -= $d366;
00869 else $d -= $d365;
00870 if ($d < 0) {
00871 $year = $a;
00872 break;
00873 }
00874 }
00875 $secsInYear = $lastd;
00876 $d = $lastd;
00877 $mtab = ($leaf) ? $_month_table_leaf : $_month_table_normal;
00878 for ($a = 1 ; $a <= 12; $a++) {
00879 $lastd = $d;
00880 $d -= $mtab[$a] * $_day_power;
00881 if ($d < 0) {
00882 $month = $a;
00883 $ndays = $mtab[$a];
00884 break;
00885 }
00886 }
00887 $d = $lastd;
00888 $day = ceil(($d+1) / $_day_power);
00889 $d = $d - ($day-1) * $_day_power;
00890 $hour = floor($d /$_hour_power);
00891 }
00892
00893 $d -= $hour * $_hour_power;
00894 $min = floor($d/$_min_power);
00895 $secs = $d - $min * $_min_power;
00896 if ($fast) {
00897 return array(
00898 'seconds' => $secs,
00899 'minutes' => $min,
00900 'hours' => $hour,
00901 'mday' => $day,
00902 'mon' => $month,
00903 'year' => $year,
00904 'yday' => floor($secsInYear/$_day_power),
00905 'leap' => $leaf,
00906 'ndays' => $ndays
00907 );
00908 }
00909
00910
00911 $dow = adodb_dow($year,$month,$day);
00912
00913 return array(
00914 'seconds' => $secs,
00915 'minutes' => $min,
00916 'hours' => $hour,
00917 'mday' => $day,
00918 'wday' => $dow,
00919 'mon' => $month,
00920 'year' => $year,
00921 'yday' => floor($secsInYear/$_day_power),
00922 'weekday' => gmdate('l',$_day_power*(3+$dow)),
00923 'month' => gmdate('F',mktime(0,0,0,$month,2,1971)),
00924 0 => $origd
00925 );
00926 }
00927
00928 function adodb_gmdate($fmt,$d=false)
00929 {
00930 return adodb_date($fmt,$d,true);
00931 }
00932
00933
00934 function adodb_date2($fmt, $d=false, $is_gmt=false)
00935 {
00936 if ($d !== false) {
00937 if (!preg_match(
00938 "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})[ -]?(([0-9]{1,2}):?([0-9]{1,2}):?([0-9\.]{1,4}))?|",
00939 ($d), $rr)) return adodb_date($fmt,false,$is_gmt);
00940
00941 if ($rr[1] <= 100 && $rr[2]<= 1) return adodb_date($fmt,false,$is_gmt);
00942
00943
00944 if (!isset($rr[5])) $d = adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1],false,$is_gmt);
00945 else $d = @adodb_mktime($rr[5],$rr[6],$rr[7],$rr[2],$rr[3],$rr[1],false,$is_gmt);
00946 }
00947
00948 return adodb_date($fmt,$d,$is_gmt);
00949 }
00950
00951
00955 function adodb_date($fmt,$d=false,$is_gmt=false)
00956 {
00957 static $daylight;
00958
00959 if ($d === false) return ($is_gmt)? @gmdate($fmt): @date($fmt);
00960 if (!defined('ADODB_TEST_DATES')) {
00961 if ((abs($d) <= 0x7FFFFFFF)) {
00962 if (!defined('ADODB_NO_NEGATIVE_TS') || $d >= 0)
00963 return ($is_gmt)? @gmdate($fmt,$d): @date($fmt,$d);
00964
00965 }
00966 }
00967 $_day_power = 86400;
00968
00969 $arr = _adodb_getdate($d,true,$is_gmt);
00970
00971 if (!isset($daylight)) $daylight = function_exists('adodb_daylight_sv');
00972 if ($daylight) adodb_daylight_sv($arr, $is_gmt);
00973
00974 $year = $arr['year'];
00975 $month = $arr['mon'];
00976 $day = $arr['mday'];
00977 $hour = $arr['hours'];
00978 $min = $arr['minutes'];
00979 $secs = $arr['seconds'];
00980
00981 $max = strlen($fmt);
00982 $dates = '';
00983
00984 $isphp5 = PHP_VERSION >= 5;
00985
00986
00987
00988
00989
00990 for ($i=0; $i < $max; $i++) {
00991 switch($fmt[$i]) {
00992 case 'T': $dates .= date('T');break;
00993
00994 case 'L': $dates .= $arr['leap'] ? '1' : '0'; break;
00995 case 'r':
00996
00997
00998
00999 $dates .= gmdate('D',$_day_power*(3+adodb_dow($year,$month,$day))).', '
01000 . ($day<10?'0'.$day:$day) . ' '.date('M',mktime(0,0,0,$month,2,1971)).' '.$year.' ';
01001
01002 if ($hour < 10) $dates .= '0'.$hour; else $dates .= $hour;
01003
01004 if ($min < 10) $dates .= ':0'.$min; else $dates .= ':'.$min;
01005
01006 if ($secs < 10) $dates .= ':0'.$secs; else $dates .= ':'.$secs;
01007
01008 $gmt = adodb_get_gmt_diff();
01009 if ($isphp5)
01010 $dates .= sprintf(' %s%04d',($gmt<=0)?'+':'-',abs($gmt)/36);
01011 else
01012 $dates .= sprintf(' %s%04d',($gmt<0)?'+':'-',abs($gmt)/36);
01013 break;
01014
01015 case 'Y': $dates .= $year; break;
01016 case 'y': $dates .= substr($year,strlen($year)-2,2); break;
01017
01018 case 'm': if ($month<10) $dates .= '0'.$month; else $dates .= $month; break;
01019 case 'Q': $dates .= ($month+3)>>2; break;
01020 case 'n': $dates .= $month; break;
01021 case 'M': $dates .= date('M',mktime(0,0,0,$month,2,1971)); break;
01022 case 'F': $dates .= date('F',mktime(0,0,0,$month,2,1971)); break;
01023
01024 case 't': $dates .= $arr['ndays']; break;
01025 case 'z': $dates .= $arr['yday']; break;
01026 case 'w': $dates .= adodb_dow($year,$month,$day); break;
01027 case 'l': $dates .= gmdate('l',$_day_power*(3+adodb_dow($year,$month,$day))); break;
01028 case 'D': $dates .= gmdate('D',$_day_power*(3+adodb_dow($year,$month,$day))); break;
01029 case 'j': $dates .= $day; break;
01030 case 'd': if ($day<10) $dates .= '0'.$day; else $dates .= $day; break;
01031 case 'S':
01032 $d10 = $day % 10;
01033 if ($d10 == 1) $dates .= 'st';
01034 else if ($d10 == 2 && $day != 12) $dates .= 'nd';
01035 else if ($d10 == 3) $dates .= 'rd';
01036 else $dates .= 'th';
01037 break;
01038
01039
01040 case 'Z':
01041 $dates .= ($is_gmt) ? 0 : -adodb_get_gmt_diff(); break;
01042 case 'O':
01043 $gmt = ($is_gmt) ? 0 : adodb_get_gmt_diff();
01044
01045 if ($isphp5)
01046 $dates .= sprintf('%s%04d',($gmt<=0)?'+':'-',abs($gmt)/36);
01047 else
01048 $dates .= sprintf('%s%04d',($gmt<0)?'+':'-',abs($gmt)/36);
01049 break;
01050
01051 case 'H':
01052 if ($hour < 10) $dates .= '0'.$hour;
01053 else $dates .= $hour;
01054 break;
01055 case 'h':
01056 if ($hour > 12) $hh = $hour - 12;
01057 else {
01058 if ($hour == 0) $hh = '12';
01059 else $hh = $hour;
01060 }
01061
01062 if ($hh < 10) $dates .= '0'.$hh;
01063 else $dates .= $hh;
01064 break;
01065
01066 case 'G':
01067 $dates .= $hour;
01068 break;
01069
01070 case 'g':
01071 if ($hour > 12) $hh = $hour - 12;
01072 else {
01073 if ($hour == 0) $hh = '12';
01074 else $hh = $hour;
01075 }
01076 $dates .= $hh;
01077 break;
01078
01079 case 'i': if ($min < 10) $dates .= '0'.$min; else $dates .= $min; break;
01080
01081 case 'U': $dates .= $d; break;
01082 case 's': if ($secs < 10) $dates .= '0'.$secs; else $dates .= $secs; break;
01083
01084
01085 case 'a':
01086 if ($hour>=12) $dates .= 'pm';
01087 else $dates .= 'am';
01088 break;
01089 case 'A':
01090 if ($hour>=12) $dates .= 'PM';
01091 else $dates .= 'AM';
01092 break;
01093 default:
01094 $dates .= $fmt[$i]; break;
01095
01096 case "\\":
01097 $i++;
01098 if ($i < $max) $dates .= $fmt[$i];
01099 break;
01100 }
01101 }
01102 return $dates;
01103 }
01104
01109 function adodb_gmmktime($hr,$min,$sec,$mon=false,$day=false,$year=false,$is_dst=false)
01110 {
01111 return adodb_mktime($hr,$min,$sec,$mon,$day,$year,$is_dst,true);
01112 }
01113
01120 function adodb_mktime($hr,$min,$sec,$mon=false,$day=false,$year=false,$is_dst=false,$is_gmt=false)
01121 {
01122 if (!defined('ADODB_TEST_DATES')) {
01123
01124 if ($mon === false) {
01125 return $is_gmt? @gmmktime($hr,$min,$sec): @mktime($hr,$min,$sec);
01126 }
01127
01128
01129
01130 if (1971 < $year && $year < 2038
01131 || !defined('ADODB_NO_NEGATIVE_TS') && (1901 < $year && $year < 2038)
01132 ) {
01133 return $is_gmt ?
01134 @gmmktime($hr,$min,$sec,$mon,$day,$year):
01135 @mktime($hr,$min,$sec,$mon,$day,$year);
01136 }
01137 }
01138
01139 $gmt_different = ($is_gmt) ? 0 : adodb_get_gmt_diff();
01140
01141
01142
01143
01144
01145
01146
01147
01148 $mon = intval($mon);
01149 $day = intval($day);
01150 $year = intval($year);
01151
01152
01153 $year = adodb_year_digit_check($year);
01154
01155 if ($mon > 12) {
01156 $y = floor($mon / 12);
01157 $year += $y;
01158 $mon -= $y*12;
01159 } else if ($mon < 1) {
01160 $y = ceil((1-$mon) / 12);
01161 $year -= $y;
01162 $mon += $y*12;
01163 }
01164
01165 $_day_power = 86400;
01166 $_hour_power = 3600;
01167 $_min_power = 60;
01168
01169 $_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31);
01170 $_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31);
01171
01172 $_total_date = 0;
01173 if ($year >= 1970) {
01174 for ($a = 1970 ; $a <= $year; $a++) {
01175 $leaf = _adodb_is_leap_year($a);
01176 if ($leaf == true) {
01177 $loop_table = $_month_table_leaf;
01178 $_add_date = 366;
01179 } else {
01180 $loop_table = $_month_table_normal;
01181 $_add_date = 365;
01182 }
01183 if ($a < $year) {
01184 $_total_date += $_add_date;
01185 } else {
01186 for($b=1;$b<$mon;$b++) {
01187 $_total_date += $loop_table[$b];
01188 }
01189 }
01190 }
01191 $_total_date +=$day-1;
01192 $ret = $_total_date * $_day_power + $hr * $_hour_power + $min * $_min_power + $sec + $gmt_different;
01193
01194 } else {
01195 for ($a = 1969 ; $a >= $year; $a--) {
01196 $leaf = _adodb_is_leap_year($a);
01197 if ($leaf == true) {
01198 $loop_table = $_month_table_leaf;
01199 $_add_date = 366;
01200 } else {
01201 $loop_table = $_month_table_normal;
01202 $_add_date = 365;
01203 }
01204 if ($a > $year) { $_total_date += $_add_date;
01205 } else {
01206 for($b=12;$b>$mon;$b--) {
01207 $_total_date += $loop_table[$b];
01208 }
01209 }
01210 }
01211 $_total_date += $loop_table[$mon] - $day;
01212
01213 $_day_time = $hr * $_hour_power + $min * $_min_power + $sec;
01214 $_day_time = $_day_power - $_day_time;
01215 $ret = -( $_total_date * $_day_power + $_day_time - $gmt_different);
01216 if ($ret < -12220185600) $ret += 10*86400;
01217 else if ($ret < -12219321600) $ret = -12219321600;
01218 }
01219
01220 return $ret;
01221 }
01222
01223 function adodb_gmstrftime($fmt, $ts=false)
01224 {
01225 return adodb_strftime($fmt,$ts,true);
01226 }
01227
01228
01229 function adodb_strftime($fmt, $ts=false,$is_gmt=false)
01230 {
01231 global $ADODB_DATE_LOCALE;
01232
01233 if (!defined('ADODB_TEST_DATES')) {
01234 if ((abs($ts) <= 0x7FFFFFFF)) {
01235 if (!defined('ADODB_NO_NEGATIVE_TS') || $ts >= 0)
01236 return ($is_gmt)? @gmstrftime($fmt,$ts): @strftime($fmt,$ts);
01237
01238 }
01239 }
01240
01241 if (empty($ADODB_DATE_LOCALE)) {
01242 $tstr = strtoupper(gmstrftime('%c',31366800));
01243 $sep = substr($tstr,2,1);
01244 $hasAM = strrpos($tstr,'M') !== false;
01245
01246 $ADODB_DATE_LOCALE = array();
01247 $ADODB_DATE_LOCALE[] = strncmp($tstr,'30',2) == 0 ? 'd'.$sep.'m'.$sep.'y' : 'm'.$sep.'d'.$sep.'y';
01248 $ADODB_DATE_LOCALE[] = ($hasAM) ? 'h:i:s a' : 'H:i:s';
01249
01250 }
01251 $inpct = false;
01252 $fmtdate = '';
01253 for ($i=0,$max = strlen($fmt); $i < $max; $i++) {
01254 $ch = $fmt[$i];
01255 if ($ch == '%') {
01256 if ($inpct) {
01257 $fmtdate .= '%';
01258 $inpct = false;
01259 } else
01260 $inpct = true;
01261 } else if ($inpct) {
01262
01263 $inpct = false;
01264 switch($ch) {
01265 case '0':
01266 case '1':
01267 case '2':
01268 case '3':
01269 case '4':
01270 case '5':
01271 case '6':
01272 case '7':
01273 case '8':
01274 case '9':
01275 case 'E':
01276 case 'O':
01277
01278 $inpct = true;
01279 break;
01280
01281 case 'a': $fmtdate .= 'D'; break;
01282 case 'A': $fmtdate .= 'l'; break;
01283 case 'h':
01284 case 'b': $fmtdate .= 'M'; break;
01285 case 'B': $fmtdate .= 'F'; break;
01286 case 'c': $fmtdate .= $ADODB_DATE_LOCALE[0].$ADODB_DATE_LOCALE[1]; break;
01287 case 'C': $fmtdate .= '\C?'; break;
01288 case 'd': $fmtdate .= 'd'; break;
01289 case 'D': $fmtdate .= 'm/d/y'; break;
01290 case 'e': $fmtdate .= 'j'; break;
01291 case 'g': $fmtdate .= '\g?'; break;
01292 case 'G': $fmtdate .= '\G?'; break;
01293 case 'H': $fmtdate .= 'H'; break;
01294 case 'I': $fmtdate .= 'h'; break;
01295 case 'j': $fmtdate .= '?z'; $parsej = true; break;
01296 case 'm': $fmtdate .= 'm'; break;
01297 case 'M': $fmtdate .= 'i'; break;
01298 case 'n': $fmtdate .= "\n"; break;
01299 case 'p': $fmtdate .= 'a'; break;
01300 case 'r': $fmtdate .= 'h:i:s a'; break;
01301 case 'R': $fmtdate .= 'H:i:s'; break;
01302 case 'S': $fmtdate .= 's'; break;
01303 case 't': $fmtdate .= "\t"; break;
01304 case 'T': $fmtdate .= 'H:i:s'; break;
01305 case 'u': $fmtdate .= '?u'; $parseu = true; break;
01306 case 'U': $fmtdate .= '?U'; $parseU = true; break;
01307 case 'x': $fmtdate .= $ADODB_DATE_LOCALE[0]; break;
01308 case 'X': $fmtdate .= $ADODB_DATE_LOCALE[1]; break;
01309 case 'w': $fmtdate .= '?w'; $parseu = true; break;
01310 case 'W': $fmtdate .= '?W'; $parseU = true; break;
01311 case 'y': $fmtdate .= 'y'; break;
01312 case 'Y': $fmtdate .= 'Y'; break;
01313 case 'Z': $fmtdate .= 'T'; break;
01314 }
01315 } else if (('A' <= ($ch) && ($ch) <= 'Z' ) || ('a' <= ($ch) && ($ch) <= 'z' ))
01316 $fmtdate .= "\\".$ch;
01317 else
01318 $fmtdate .= $ch;
01319 }
01320
01321 if ($ts === false) $ts = time();
01322 $ret = adodb_date($fmtdate, $ts, $is_gmt);
01323 return $ret;
01324 }
01325
01326
01327 ?>