/**
	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.0) {
            $ret += 10 * 86400;
        } else {
            if ($ret < -12219321600.0) {
                $ret = -12219321600.0;
            }
        }
        // if in limbo, reset to 15 Oct 1582.
    }
    //print " dmy=$day/$mon/$year $hr:$min:$sec => " .$ret;
    return $ret;
}
Пример #2
0
/**
	Return a timestamp given a local time. Originally by jackbbs.
	Note that $is_dst is not implemented and is ignored.
	
	Not a very fast algorithm - O(n) operation. Could be optimized to O(1).
*/
function adodb_mktime($hr, $min, $sec, $mon = false, $day = false, $year = false, $is_dst = false, $is_gmt = false)
{
    if (!defined('ADODB_TEST_DATES')) {
        if ($mon === false) {
            return $is_gmt ? @gmmktime($hr, $min, $sec) : @mktime($hr, $min, $sec);
        }
        // for windows, we don't check 1970 because with timezone differences,
        // 1 Jan 1970 could generate negative timestamp, which is illegal
        $usephpfns = 1971 < $year && $year < 2038 || !defined('ADODB_NO_NEGATIVE_TS') && (1901 < $year && $year < 2038);
        if ($usephpfns && $year + $mon / 12 + $day / 365.25 + $hr / (24 * 365.25) >= 2038) {
            $usephpfns = false;
        }
        if ($usephpfns) {
            return $is_gmt ? @gmmktime($hr, $min, $sec, $mon, $day, $year) : @mktime($hr, $min, $sec, $mon, $day, $year);
        }
    }
    $gmt_different = $is_gmt ? 0 : adodb_get_gmt_diff($year, $mon, $day);
    /*
    # disabled because some people place large values in $sec.
    # however we need it for $mon because we use an array...
    $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 - 1) / 12);
        $year += $y;
        $mon -= $y * 12;
    } else {
        if ($mon < 1) {
            $y = ceil((1 - $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;
        } 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;
}
Пример #3
0
 /**
  * Return formatted date based on timestamp $d
  * @param string Format of date output
  * @param int Date to be converted
  * @param boolean Ignore timezone
  * @return string In the format specified by $fmt
  */
 function date($fmt, $d = false, $is_gmt = false)
 {
     static $daylight;
     if ($d === false) {
         return $is_gmt ? @gmdate($fmt) : @date($fmt);
     }
     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 $is_gmt ? @gmdate($fmt, $d) : @date($fmt, $d);
         }
     }
     $_day_power = 86400;
     $arr = $this->_getdate($d, true, $is_gmt);
     //		if (!isset($daylight)) $daylight = function_exists('adodb_daylight_sv');
     //		if ($daylight) adodb_daylight_sv($arr, $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
             // YEAR
             case 'L':
                 $dates .= $arr['leap'] ? '1' : '0';
                 break;
             case 'r':
                 // Thu, 21 Dec 2000 16:01:07 +0200
                 // 4.3.11 uses '04 Jun 2004'
                 // 4.3.8 uses  ' 4 Jun 2004'
                 $dates .= gmdate('D', $_day_power * (3 + $this->dow($year, $month, $day))) . ', ' . ($day < 10 ? '0' . $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
             // 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
             // 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 && $day != 12) {
                         $dates .= 'nd';
                     } else {
                         if ($d10 == 3) {
                             $dates .= 'rd';
                         } else {
                             $dates .= 'th';
                         }
                     }
                 }
                 break;
                 // HOUR
             // 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
             // MINUTES
             case 'i':
                 if ($min < 10) {
                     $dates .= '0' . $min;
                 } else {
                     $dates .= $min;
                 }
                 break;
                 // SECONDS
             // 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
             // 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
             // ESCAPE
             case "\\":
                 $i++;
                 if ($i < $max) {
                     $dates .= $fmt[$i];
                 }
                 break;
         }
     }
     return $dates;
 }