From: Sylvie G. <sgr...@gm...> - 2008-05-29 12:55:20
|
Sept_7 Did you forget to commit something? If I do a fgrep convertTZbyID, I did not find its definition and the line in tikilib is badly buggy tikiwiki with a white page Thanks sylvie On Tue, 2008-05-27 at 05:49 -0700, se...@us... wrote: > Revision: 12989 > http://tikiwiki.svn.sourceforge.net/tikiwiki/?rev=12989&view=rev > Author: sept_7 > Date: 2008-05-27 05:49:46 -0700 (Tue, 27 May 2008) > > Log Message: > ----------- > [FIX] : update PEAR::Date to the latest version, correct wrong timezone > calculation. > We tested it here and it solved our problem with TimeZone... > > Modified Paths: > -------------- > branches/1.10/lib/pear/Date/Calc.php > branches/1.10/lib/pear/Date/Human.php > branches/1.10/lib/pear/Date/Span.php > branches/1.10/lib/pear/Date/TimeZone.php > branches/1.10/lib/pear/Date.php > branches/1.10/lib/tikilib.php > > Removed Paths: > ------------- > branches/1.10/lib/pear/Date/TimeZoneWindows.php > > Modified: branches/1.10/lib/pear/Date/Calc.php > =================================================================== > --- branches/1.10/lib/pear/Date/Calc.php 2008-05-27 05:25:35 UTC (rev 12988) > +++ branches/1.10/lib/pear/Date/Calc.php 2008-05-27 12:49:46 UTC (rev 12989) > @@ -13,7 +13,8 @@ > * > * LICENSE: > * > - * Copyright (c) 1999-2006 Monte Ohrt, Pierre-Alain Joye, Daniel Convissor > + * Copyright (c) 1999-2007 Monte Ohrt, Pierre-Alain Joye, Daniel Convissor, > + * C.A. Woodcock > * All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > @@ -37,15 +38,18 @@ > * @author Monte Ohrt <mo...@is...> > * @author Pierre-Alain Joye <pa...@ph...> > * @author Daniel Convissor <da...@ph...> > - * @copyright 1999-2006 Monte Ohrt, Pierre-Alain Joye, Daniel Convissor > + * @author C.A. Woodcock <c0...@ne...> > + * @copyright 1999-2007 Monte Ohrt, Pierre-Alain Joye, Daniel Convissor, C.A. Woodcock > * @license http://www.opensource.org/licenses/bsd-license.php > * BSD License > - * @version CVS: Id: Calc.php,v 1.35 2006/11/21 23:01:13 firman Exp > + * @version CVS: $Id: Calc.php,v 1.57 2008/03/23 18:34:16 c01234 Exp $ > * @link http://pear.php.net/package/Date > * @since File available since Release 1.2 > */ > > + > // }}} > +// {{{ General constants: > > if (!defined('DATE_CALC_BEGIN_WEEKDAY')) { > /** > @@ -69,6 +73,20 @@ > define('DATE_CALC_FORMAT', '%Y%m%d'); > } > > + > +// {{{ Date precision constants (used in 'round()' and 'trunc()'): > + > +define('DATE_PRECISION_YEAR', -2); > +define('DATE_PRECISION_MONTH', -1); > +define('DATE_PRECISION_DAY', 0); > +define('DATE_PRECISION_HOUR', 1); > +define('DATE_PRECISION_10MINUTES', 2); > +define('DATE_PRECISION_MINUTE', 3); > +define('DATE_PRECISION_10SECONDS', 4); > +define('DATE_PRECISION_SECOND', 5); > + > + > +// }}} > // {{{ Class: Date_Calc > > /** > @@ -77,17 +95,21 @@ > * It does not rely on 32-bit system time stamps, so it works dates > * before 1970 and after 2038. > * > - * @author Monte Ohrt <mo...@is...> > - * @author Daniel Convissor <da...@ph...> > - * @copyright 1999-2006 Monte Ohrt, Pierre-Alain Joye, Daniel Convissor > - * @license http://www.opensource.org/licenses/bsd-license.php > - * BSD License > - * @version Release: 1.4.7 > - * @link http://pear.php.net/package/Date > - * @since Class available since Release 1.2 > + * @category Date and Time > + * @package Date > + * @author Monte Ohrt <mo...@is...> > + * @author Daniel Convissor <da...@ph...> > + * @author C.A. Woodcock <c0...@ne...> > + * @copyright 1999-2007 Monte Ohrt, Pierre-Alain Joye, Daniel Convissor, C.A. Woodcock > + * @license http://www.opensource.org/licenses/bsd-license.php > + * BSD License > + * @version Release: 1.5.0a1 > + * @link http://pear.php.net/package/Date > + * @since Class available since Release 1.2 > */ > class Date_Calc > { > + > // {{{ dateFormat() > > /** > @@ -120,16 +142,14 @@ > * %% literal '%' > * </pre> > * > - * @param int $day the day of the month > - * @param int $month the month > - * @param int $year the year. Use the complete year instead of the > - * abbreviated version. E.g. use 2005, not 05. > - * Do not add leading 0's for years prior to 1000. > - * @param string $format the format string > + * @param int $day the day of the month > + * @param int $month the month > + * @param int $year the year. Use the complete year instead of the > + * abbreviated version. E.g. use 2005, not 05. > + * @param string $format the format string > * > - * @return string the date in the desired format > - * > - * @access public > + * @return string the date in the desired format > + * @access public > * @static > */ > function dateFormat($day, $month, $year, $format) > @@ -147,56 +167,62 @@ > if ($char == '%') { > $nextchar = substr($format, $strpos + 1, 1); > switch($nextchar) { > - case 'a': > - $output .= Date_Calc::getWeekdayAbbrname($day, $month, $year); > - break; > - case 'A': > - $output .= Date_Calc::getWeekdayFullname($day, $month, $year); > - break; > - case 'b': > - $output .= Date_Calc::getMonthAbbrname($month); > - break; > - case 'B': > - $output .= Date_Calc::getMonthFullname($month); > - break; > - case 'd': > - $output .= sprintf('%02d', $day); > - break; > - case 'e': > - $output .= $day; > - break; > - case 'E': > - $output .= Date_Calc::dateToDays($day, $month, $year); > - break; > - case 'j': > - $output .= Date_Calc::julianDate($day, $month, $year); > - break; > - case 'm': > - $output .= sprintf('%02d', $month); > - break; > - case 'n': > - $output .= "\n"; > - break; > - case 't': > - $output .= "\t"; > - break; > - case 'w': > - $output .= Date_Calc::dayOfWeek($day, $month, $year); > - break; > - case 'U': > - $output .= Date_Calc::weekOfYear($day, $month, $year); > - break; > - case 'y': > - $output .= substr($year, 2, 2); > - break; > - case 'Y': > - $output .= $year; > - break; > - case '%': > - $output .= '%'; > - break; > - default: > - $output .= $char.$nextchar; > + case 'a': > + $output .= Date_Calc::getWeekdayAbbrname($day, $month, $year); > + break; > + case 'A': > + $output .= Date_Calc::getWeekdayFullname($day, $month, $year); > + break; > + case 'b': > + $output .= Date_Calc::getMonthAbbrname($month); > + break; > + case 'B': > + $output .= Date_Calc::getMonthFullname($month); > + break; > + case 'd': > + $output .= sprintf('%02d', $day); > + break; > + case 'e': > + $output .= $day; > + break; > + case 'E': > + $output .= Date_Calc::dateToDays($day, $month, $year); > + break; > + case 'j': > + $output .= Date_Calc::dayOfYear($day, $month, $year); > + break; > + case 'm': > + $output .= sprintf('%02d', $month); > + break; > + case 'n': > + $output .= "\n"; > + break; > + case 't': > + $output .= "\t"; > + break; > + case 'w': > + $output .= Date_Calc::dayOfWeek($day, $month, $year); > + break; > + case 'U': > + $output .= Date_Calc::weekOfYear($day, $month, $year); > + break; > + case 'y': > + $output .= sprintf('%0' . > + ($year < 0 ? '3' : '2') . > + 'd', > + $year % 100); > + break; > + case "Y": > + $output .= sprintf('%0' . > + ($year < 0 ? '5' : '4') . > + 'd', > + $year); > + break; > + case '%': > + $output .= '%'; > + break; > + default: > + $output .= $char.$nextchar; > } > $strpos++; > } else { > @@ -206,431 +232,2059 @@ > return $output; > } > > + > // }}} > + // {{{ dateNow() > + > + /** > + * Returns the current local date > + * > + * NOTE: This function retrieves the local date using strftime(), > + * which may or may not be 32-bit safe on your system. > + * > + * @param string $format the string indicating how to format the output > + * > + * @return string the current date in the specified format > + * @access public > + * @static > + */ > + function dateNow($format = DATE_CALC_FORMAT) > + { > + return strftime($format, time()); > + } > + > + > + // }}} > + // {{{ getYear() > + > + /** > + * Returns the current local year in format CCYY > + * > + * @return string the current year in four digit format > + * @access public > + * @static > + */ > + function getYear() > + { > + return Date_Calc::dateNow('%Y'); > + } > + > + > + // }}} > + // {{{ getMonth() > + > + /** > + * Returns the current local month in format MM > + * > + * @return string the current month in two digit format > + * @access public > + * @static > + */ > + function getMonth() > + { > + return Date_Calc::dateNow('%m'); > + } > + > + > + // }}} > + // {{{ getDay() > + > + /** > + * Returns the current local day in format DD > + * > + * @return string the current day of the month in two digit format > + * @access public > + * @static > + */ > + function getDay() > + { > + return Date_Calc::dateNow('%d'); > + } > + > + > + // }}} > // {{{ defaultCentury() > > /** > * Turns a two digit year into a four digit year > * > - * From '51 to '99 is in the 1900's, otherwise it's in the 2000's. > + * Return value depends on current year; the century chosen > + * will be the one which forms the year that is closest > + * to the current year. If the two possibilities are > + * equidistant to the current year (i.e. 50 years in the past > + * and 50 years in the future), then the past year is chosen. > * > - * @param int $year the 2 digit year > + * For example, if the current year is 2007: > + * 03 - returns 2003 > + * 09 - returns 2009 > + * 56 - returns 2056 (closer to 2007 than 1956) > + * 57 - returns 1957 (1957 and 2007 are equidistant, so previous century > + * chosen) > + * 58 - returns 1958 > * > - * @return string the 4 digit year > + * @param int $year the 2 digit year > * > - * @access public > + * @return int the 4 digit year > + * @access public > * @static > */ > function defaultCentury($year) > { > - if (strlen($year) == 1) { > - $year = '0' . $year; > + $hn_century = intval(($hn_currentyear = date("Y")) / 100); > + $hn_currentyear = $hn_currentyear % 100; > + > + if ($year < 0 || $year >= 100) > + $year = $year % 100; > + > + if ($year - $hn_currentyear < -50) > + return ($hn_century + 1) * 100 + $year; > + else if ($year - $hn_currentyear < 50) > + return $hn_century * 100 + $year; > + else > + return ($hn_century - 1) * 100 + $year; > + } > + > + > + // }}} > + // {{{ getSecondsInYear() > + > + /** > + * Returns the total number of seconds in the given year > + * > + * This takes into account leap seconds. > + * > + * @param int $pn_year the year in four digit format > + * > + * @return int > + * @access public > + * @static > + * @since Method available since Release 1.5.0 > + */ > + function getSecondsInYear($pn_year) > + { > + $pn_year = intval($pn_year); > + > + static $ha_leapseconds; > + if (!isset($ha_leapseconds)) { > + $ha_leapseconds = array(1972 => 2, > + 1973 => 1, > + 1974 => 1, > + 1975 => 1, > + 1976 => 1, > + 1977 => 1, > + 1978 => 1, > + 1979 => 1, > + 1981 => 1, > + 1982 => 1, > + 1983 => 1, > + 1985 => 1, > + 1987 => 1, > + 1989 => 1, > + 1990 => 1, > + 1992 => 1, > + 1993 => 1, > + 1994 => 1, > + 1995 => 1, > + 1997 => 1, > + 1998 => 1, > + 2005 => 1); > } > - if ($year > 50) { > - return '19' . $year; > + > + $ret = Date_Calc::daysInYear($pn_year) * 86400; > + > + if (isset($ha_leapseconds[$pn_year])) { > + return $ret + $ha_leapseconds[$pn_year]; > } else { > - return '20' . $year; > + return $ret; > } > } > > + > // }}} > + // {{{ getSecondsInMonth() > + > + /** > + * Returns the total number of seconds in the given month > + * > + * This takes into account leap seconds. > + * > + * @param int $pn_month the month > + * @param int $pn_year the year in four digit format > + * > + * @return int > + * @access public > + * @static > + * @since Method available since Release 1.5.0 > + */ > + function getSecondsInMonth($pn_month, $pn_year) > + { > + $pn_month = intval($pn_month); > + $pn_year = intval($pn_year); > + > + static $ha_leapseconds; > + if (!isset($ha_leapseconds)) { > + $ha_leapseconds = array(1972 => array(6 => 1, > + 12 => 1), > + 1973 => array(12 => 1), > + 1974 => array(12 => 1), > + 1975 => array(12 => 1), > + 1976 => array(12 => 1), > + 1977 => array(12 => 1), > + 1978 => array(12 => 1), > + 1979 => array(12 => 1), > + 1981 => array(6 => 1), > + 1982 => array(6 => 1), > + 1983 => array(6 => 1), > + 1985 => array(6 => 1), > + 1987 => array(12 => 1), > + 1989 => array(12 => 1), > + 1990 => array(12 => 1), > + 1992 => array(6 => 1), > + 1993 => array(6 => 1), > + 1994 => array(6 => 1), > + 1995 => array(12 => 1), > + 1997 => array(6 => 1), > + 1998 => array(12 => 1), > + 2005 => array(12 => 1)); > + } > + > + $ret = Date_Calc::daysInMonth($pn_month, $pn_year) * 86400; > + > + if (isset($ha_leapseconds[$pn_year][$pn_month])) { > + return $ret + $ha_leapseconds[$pn_year][$pn_month]; > + } else { > + return $ret; > + } > + } > + > + > + // }}} > + // {{{ getSecondsInDay() > + > + /** > + * Returns the total number of seconds in the day of the given date > + * > + * This takes into account leap seconds. > + * > + * @param int $pn_day the day of the month > + * @param int $pn_month the month > + * @param int $pn_year the year in four digit format > + * > + * @return int > + * @access public > + * @static > + * @since Method available since Release 1.5.0 > + */ > + function getSecondsInDay($pn_day, $pn_month, $pn_year) > + { > + // Note to developers: > + // > + // The leap seconds listed here are a matter of historical fact, > + // that is, it is known on which exact day they occurred. > + // However, the implementation of the class as a whole depends > + // on the fact that they always occur at the end of the month > + // (although it is assumed that they could occur in any month, > + // even though practically they only occur in June or December). > + // > + // Do not define a leap second on a day of the month other than > + // the last day without altering the implementation of the > + // functions that depend on this one. > + // > + // It is possible, though, to define an un-leap second (i.e. a skipped > + // second (I do not know what they are called), or a number of > + // consecutive leap seconds). > + > + $pn_day = intval($pn_day); > + $pn_month = intval($pn_month); > + $pn_year = intval($pn_year); > + > + static $ha_leapseconds; > + if (!isset($ha_leapseconds)) { > + $ha_leapseconds = array(1972 => array(6 => array(30 => 1), > + 12 => array(31 => 1)), > + 1973 => array(12 => array(31 => 1)), > + 1974 => array(12 => array(31 => 1)), > + 1975 => array(12 => array(31 => 1)), > + 1976 => array(12 => array(31 => 1)), > + 1977 => array(12 => array(31 => 1)), > + 1978 => array(12 => array(31 => 1)), > + 1979 => array(12 => array(31 => 1)), > + 1981 => array(6 => array(30 => 1)), > + 1982 => array(6 => array(30 => 1)), > + 1983 => array(6 => array(30 => 1)), > + 1985 => array(6 => array(30 => 1)), > + 1987 => array(12 => array(31 => 1)), > + 1989 => array(12 => array(31 => 1)), > + 1990 => array(12 => array(31 => 1)), > + 1992 => array(6 => array(30 => 1)), > + 1993 => array(6 => array(30 => 1)), > + 1994 => array(6 => array(30 => 1)), > + 1995 => array(12 => array(31 => 1)), > + 1997 => array(6 => array(30 => 1)), > + 1998 => array(12 => array(31 => 1)), > + 2005 => array(12 => array(31 => 1))); > + } > + > + if (isset($ha_leapseconds[$pn_year][$pn_month][$pn_day])) { > + return 86400 + $ha_leapseconds[$pn_year][$pn_month][$pn_day]; > + } else { > + return 86400; > + } > + } > + > + > + // }}} > + // {{{ getSecondsInHour() > + > + /** > + * Returns the total number of seconds in the hour of the given date > + * > + * This takes into account leap seconds. > + * > + * @param int $pn_day the day of the month > + * @param int $pn_month the month > + * @param int $pn_year the year in four digit format > + * @param int $pn_hour the hour > + * > + * @return int > + * @access public > + * @static > + */ > + function getSecondsInHour($pn_day, $pn_month, $pn_year, $pn_hour) > + { > + if ($pn_hour < 23) > + return 3600; > + else > + return Date_Calc::getSecondsInDay($pn_day, $pn_month, $pn_year) - > + 82800; > + } > + > + > + // }}} > + // {{{ getSecondsInMinute() > + > + /** > + * Returns the total number of seconds in the minute of the given hour > + * > + * This takes into account leap seconds. > + * > + * @param int $pn_day the day of the month > + * @param int $pn_month the month > + * @param int $pn_year the year in four digit format > + * @param int $pn_hour the hour > + * @param int $pn_minute the minute > + * > + * @return int > + * @access public > + * @static > + * @since Method available since Release 1.5.0 > + */ > + function getSecondsInMinute($pn_day, > + $pn_month, > + $pn_year, > + $pn_hour, > + $pn_minute) > + { > + if ($pn_hour < 23 || $pn_minute < 59) > + return 60; > + else > + return Date_Calc::getSecondsInDay($pn_day, $pn_month, $pn_year) - > + 86340; > + } > + > + > + // }}} > + // {{{ secondsPastMidnight() > + > + /** > + * Returns the no of seconds since midnight (0-86399) > + * > + * @param int $pn_hour the hour of the day > + * @param int $pn_minute the minute > + * @param mixed $pn_second the second as integer or float > + * > + * @return mixed integer or float from 0-86399 > + * @access public > + * @static > + * @since Method available since Release 1.5.0 > + */ > + function secondsPastMidnight($pn_hour, $pn_minute, $pn_second) > + { > + return 3600 * $pn_hour + 60 * $pn_minute + $pn_second; > + } > + > + > + // }}} > + // {{{ secondsPastMidnightToTime() > + > + /** > + * Returns the time as an array (i.e. hour, minute, second) > + * > + * @param mixed $pn_seconds the no of seconds since midnight (0-86399) > + * > + * @return mixed array of hour, minute (both as integers), second (as > + * integer or float, depending on parameter) > + * @access public > + * @static > + * @since Method available since Release 1.5.0 > + */ > + function secondsPastMidnightToTime($pn_seconds) > + { > + if ($pn_seconds >= 86400) { > + return array(23, 59, $pn_seconds - 86340); > + } > + > + $hn_hour = intval($pn_seconds / 3600); > + $hn_minute = intval(($pn_seconds - $hn_hour * 3600) / 60); > + $hn_second = is_float($pn_seconds) ? > + fmod($pn_seconds, 60) : > + $pn_seconds % 60; > + > + return array($hn_hour, $hn_minute, $hn_second); > + } > + > + > + // }}} > + // {{{ secondsPastTheHour() > + > + /** > + * Returns the no of seconds since the last hour o'clock (0-3599) > + * > + * @param int $pn_minute the minute > + * @param mixed $pn_second the second as integer or float > + * > + * @return mixed integer or float from 0-3599 > + * @access public > + * @static > + * @since Method available since Release 1.5.0 > + */ > + function secondsPastTheHour($pn_minute, $pn_second) > + { > + return 60 * $pn_minute + $pn_second; > + } > + > + > + // }}} > + // {{{ addHours() > + > + /** > + * Returns the date the specified no of hours from the given date > + * > + * To subtract hours use a negative value for the '$pn_hours' parameter > + * > + * @param int $pn_hours hours to add > + * @param int $pn_day the day of the month > + * @param int $pn_month the month > + * @param int $pn_year the year > + * @param int $pn_hour the hour > + * > + * @return array array of year, month, day, hour > + * @access public > + * @static > + * @since Method available since Release 1.5.0 > + */ > + function addHours($pn_hours, $pn_day, $pn_month, $pn_year, $pn_hour) > + { > + if ($pn_hours == 0) > + return array((int) $pn_year, > + (int) $pn_month, > + (int) $pn_day, > + (int) $pn_hour); > + > + $hn_days = intval($pn_hours / 24); > + $hn_hour = $pn_hour + $pn_hours % 24; > + > + if ($hn_hour >= 24) { > + ++$hn_days; > + $hn_hour -= 24; > + } else if ($hn_hour < 0) { > + --$hn_days; > + $hn_hour += 24; > + } > + > + if ($hn_days == 0) { > + $hn_year = $pn_year; > + $hn_month = $pn_month; > + $hn_day = $pn_day; > + } else { > + list($hn_year, $hn_month, $hn_day) = > + explode(" ", > + Date_Calc::addDays($hn_days, > + $pn_day, > + $pn_month, > + $pn_year, > + "%Y %m %d")); > + } > + > + return array((int) $hn_year, (int) $hn_month, (int) $hn_day, $hn_hour); > + } > + > + > + // }}} > + // {{{ addMinutes() > + > + /** > + * Returns the date the specified no of minutes from the given date > + * > + * To subtract minutes use a negative value for the '$pn_minutes' parameter > + * > + * @param int $pn_minutes minutes to add > + * @param int $pn_day the day of the month > + * @param int $pn_month the month > + * @param int $pn_year the year > + * @param int $pn_hour the hour > + * @param int $pn_minute the minute > + * > + * @return array array of year, month, day, hour, minute > + * @access public > + * @static > + * @since Method available since Release 1.5.0 > + */ > + function addMinutes($pn_minutes, > + $pn_day, > + $pn_month, > + $pn_year, > + $pn_hour, > + $pn_minute) > + { > + if ($pn_minutes == 0) > + return array((int) $pn_year, > + (int) $pn_month, > + (int) $pn_day, > + (int) $pn_hour, > + (int) $pn_minute); > + > + $hn_hours = intval($pn_minutes / 60); > + $hn_minute = $pn_minute + $pn_minutes % 60; > + > + if ($hn_minute >= 60) { > + ++$hn_hours; > + $hn_minute -= 60; > + } else if ($hn_minute < 0) { > + --$hn_hours; > + $hn_minute += 60; > + } > + > + if ($hn_hours == 0) { > + $hn_year = $pn_year; > + $hn_month = $pn_month; > + $hn_day = $pn_day; > + $hn_hour = $pn_hour; > + } else { > + list($hn_year, $hn_month, $hn_day, $hn_hour) = > + Date_Calc::addHours($hn_hours, > + $pn_day, > + $pn_month, > + $pn_year, > + $pn_hour); > + } > + > + return array($hn_year, $hn_month, $hn_day, $hn_hour, $hn_minute); > + } > + > + > + // }}} > + // {{{ addSeconds() > + > + /** > + * Returns the date the specified no of seconds from the given date > + * > + * If leap seconds are specified to be counted, the passed time must be UTC. > + * To subtract seconds use a negative value for the '$pn_seconds' parameter. > + * > + * N.B. the return type of the second part of the date is float if > + * either '$pn_seconds' or '$pn_second' is a float; otherwise, it > + * is integer. > + * > + * @param mixed $pn_seconds seconds to add as integer or float > + * @param int $pn_day the day of the month > + * @param int $pn_month the month > + * @param int $pn_year the year > + * @param int $pn_hour the hour > + * @param int $pn_minute the minute > + * @param mixed $pn_second the second as integer or float > + * @param bool $pb_countleap whether to count leap seconds (defaults to > + * DATE_COUNT_LEAP_SECONDS) > + * > + * @return array array of year, month, day, hour, minute, second > + * @access public > + * @static > + * @since Method available since Release 1.5.0 > + */ > + function addSeconds($pn_seconds, > + $pn_day, > + $pn_month, > + $pn_year, > + $pn_hour, > + $pn_minute, > + $pn_second, > + $pb_countleap = DATE_COUNT_LEAP_SECONDS) > + { > + if ($pn_seconds == 0) > + return array((int) $pn_year, > + (int) $pn_month, > + (int) $pn_day, > + (int) $pn_hour, > + (int) $pn_minute, > + $pn_second); > + > + if ($pb_countleap) { > + $hn_seconds = $pn_seconds; > + > + $hn_day = (int) $pn_day; > + $hn_month = (int) $pn_month; > + $hn_year = (int) $pn_year; > + $hn_hour = (int) $pn_hour; > + $hn_minute = (int) $pn_minute; > + $hn_second = $pn_second; > + > + $hn_days = Date_Calc::dateToDays($pn_day, > + $pn_month, > + $pn_year); > + $hn_secondsofmonth = 86400 * ($hn_days - > + Date_Calc::firstDayOfMonth($pn_month, > + $pn_year)) + > + Date_Calc::secondsPastMidnight($pn_hour, > + $pn_minute, > + $pn_second); > + > + if ($hn_seconds > 0) { > + // Advance to end of month: > + // > + if ($hn_secondsofmonth != 0 && > + $hn_secondsofmonth + $hn_seconds >= > + ($hn_secondsinmonth = > + Date_Calc::getSecondsInMonth($hn_month, $hn_year))) { > + > + $hn_seconds -= $hn_secondsinmonth - $hn_secondsofmonth; > + $hn_secondsofmonth = 0; > + list($hn_year, $hn_month) = > + Date_Calc::nextMonth($hn_month, $hn_year); > + $hn_day = Date_Calc::getFirstDayOfMonth($hn_month, > + $hn_year); > + $hn_hour = $hn_minute = $hn_second = 0; > + } > + > + // Advance to end of year: > + // > + if ($hn_secondsofmonth == 0 && > + $hn_month != Date_Calc::getFirstMonthOfYear($hn_year)) { > + > + while ($hn_year == $pn_year && > + $hn_seconds >= ($hn_secondsinmonth = > + Date_Calc::getSecondsInMonth($hn_month, > + $hn_year))) { > + $hn_seconds -= $hn_secondsinmonth; > + list($hn_year, $hn_month) = > + Date_Calc::nextMonth($hn_month, $hn_year); > + $hn_day = Date_Calc::getFirstDayOfMonth($hn_month, > + $hn_year); > + } > + } > + > + if ($hn_secondsofmonth == 0) { > + // Add years: > + // > + if ($hn_month == Date_Calc::getFirstMonthOfYear($hn_year)) { > + while ($hn_seconds >= ($hn_secondsinyear = > + Date_Calc::getSecondsInYear($hn_year))) { > + $hn_seconds -= $hn_secondsinyear; > + $hn_month = Date_Calc::getFirstMonthOfYear(++$hn_year); > + $hn_day = Date_Calc::getFirstDayOfMonth($hn_month, > + $hn_year); > + } > + } > + > + // Add months: > + // > + while ($hn_seconds >= ($hn_secondsinmonth = > + Date_Calc::getSecondsInMonth($hn_month, $hn_year))) { > + $hn_seconds -= $hn_secondsinmonth; > + list($hn_year, $hn_month) = > + Date_Calc::nextMonth($hn_month, $hn_year); > + $hn_day = Date_Calc::getFirstDayOfMonth($hn_month, $hn_year); > + } > + } > + } else { > + // > + // (if $hn_seconds < 0) > + > + // Go back to start of month: > + // > + if ($hn_secondsofmonth != 0 && > + -$hn_seconds >= $hn_secondsofmonth) { > + > + $hn_seconds += $hn_secondsofmonth; > + $hn_secondsofmonth = 0; > + $hn_day = Date_Calc::getFirstDayOfMonth($hn_month, > + $hn_year); > + $hn_hour = $hn_minute = $hn_second = 0; > + } > + > + // Go back to start of year: > + // > + if ($hn_secondsofmonth == 0) { > + while ($hn_month != > + Date_Calc::getFirstMonthOfYear($hn_year)) { > + > + list($hn_year, $hn_prevmonth) = > + Date_Calc::prevMonth($hn_month, $hn_year); > + > + if (-$hn_seconds >= ($hn_secondsinmonth = > + Date_Calc::getSecondsInMonth($hn_prevmonth, > + $hn_year))) { > + $hn_seconds += $hn_secondsinmonth; > + $hn_month = $hn_prevmonth; > + $hn_day = Date_Calc::getFirstDayOfMonth($hn_month, > + $hn_year); > + } else { > + break; > + } > + } > + } > + > + if ($hn_secondsofmonth == 0) { > + // Subtract years: > + // > + if ($hn_month == Date_Calc::getFirstMonthOfYear($hn_year)) { > + while (-$hn_seconds >= ($hn_secondsinyear = > + Date_Calc::getSecondsInYear($hn_year - 1))) { > + $hn_seconds += $hn_secondsinyear; > + $hn_month = Date_Calc::getFirstMonthOfYear(--$hn_year); > + $hn_day = Date_Calc::getFirstDayOfMonth($hn_month, > + $hn_year); > + } > + } > + > + // Subtract months: > + // > + list($hn_pmyear, $hn_prevmonth) = > + Date_Calc::prevMonth($hn_month, $hn_year); > + while (-$hn_seconds >= ($hn_secondsinmonth = > + Date_Calc::getSecondsInMonth($hn_prevmonth, > + $hn_pmyear))) { > + $hn_seconds += $hn_secondsinmonth; > + $hn_year = $hn_pmyear; > + $hn_month = $hn_prevmonth; > + $hn_day = Date_Calc::getFirstDayOfMonth($hn_month, > + $hn_year); > + list($hn_pmyear, $hn_prevmonth) = > + Date_Calc::prevMonth($hn_month, $hn_year); > + } > + } > + } > + > + if ($hn_seconds < 0 && $hn_secondsofmonth == 0) { > + list($hn_year, $hn_month) = > + Date_Calc::prevMonth($hn_month, $hn_year); > + $hn_day = Date_Calc::getFirstDayOfMonth($hn_month, $hn_year); > + $hn_seconds += Date_Calc::getSecondsInMonth($hn_month, $hn_year); > + } > + > + $hn_seconds += Date_Calc::secondsPastMidnight($hn_hour, > + $hn_minute, > + $hn_second); > + if ($hn_seconds < 0) { > + $hn_daysadd = intval($hn_seconds / 86400) - 1; > + } else if ($hn_seconds < 86400) { > + $hn_daysadd = 0; > + } else { > + $hn_daysadd = intval($hn_seconds / 86400) - 1; > + } > + > + if ($hn_daysadd != 0) { > + list($hn_year, $hn_month, $hn_day) = > + explode(" ", > + Date_Calc::addDays($hn_daysadd, > + $hn_day, > + $hn_month, > + $hn_year, > + "%Y %m %d")); > + $hn_seconds -= $hn_daysadd * 86400; > + } > + > + $hn_secondsinday = Date_Calc::getSecondsInDay($hn_day, > + $hn_month, > + $hn_year); > + if ($hn_seconds >= $hn_secondsinday) { > + list($hn_year, $hn_month, $hn_day) = > + explode(" ", > + Date_Calc::addDays(1, > + $hn_day, > + $hn_month, > + $hn_year, > + "%Y %m %d")); > + $hn_seconds -= $hn_secondsinday; > + } > + > + list($hn_hour, $hn_minute, $hn_second) = > + Date_Calc::secondsPastMidnightToTime($hn_seconds); > + > + return array((int) $hn_year, > + (int) $hn_month, > + (int) $hn_day, > + $hn_hour, > + $hn_minute, > + $hn_second); > + } else { > + // Assume every day has 86400 seconds exactly (ignore leap seconds): > + // > + $hn_minutes = intval($pn_seconds / 60); > + > + if (is_float($pn_seconds)) { > + $hn_second = $pn_second + fmod($pn_seconds, 60); > + } else { > + $hn_second = $pn_second + $pn_seconds % 60; > + } > + > + if ($hn_second >= 60) { > + ++$hn_minutes; > + $hn_second -= 60; > + } else if ($hn_second < 0) { > + --$hn_minutes; > + $hn_second += 60; > + } > + > + if ($hn_minutes == 0) { > + $hn_year = $pn_year; > + $hn_month = $pn_month; > + $hn_day = $pn_day; > + $hn_hour = $pn_hour; > + $hn_minute = $pn_minute; > + } else { > + list($hn_year, $hn_month, $hn_day, $hn_hour, $hn_minute) = > + Date_Calc::addMinutes($hn_minutes, > + $pn_day, > + $pn_month, > + $pn_year, > + $pn_hour, > + $pn_minute); > + } > + > + return array($hn_year, > + $hn_month, > + $hn_day, > + $hn_hour, > + $hn_minute, > + $hn_second); > + } > + } > + > + > + // }}} > // {{{ dateToDays() > > /** > - * Converts a date to number of days since a distant unspecified epoch > + * Converts a date in the proleptic Gregorian calendar to the no of days > + * since 24th November, 4714 B.C. > * > - * @param int $day the day of the month > - * @param int $month the month > - * @param int $year the year. Use the complete year instead of the > - * abbreviated version. E.g. use 2005, not 05. > - * Do not add leading 0's for years prior to 1000. > + * Returns the no of days since Monday, 24th November, 4714 B.C. in the > + * proleptic Gregorian calendar (which is 24th November, -4713 using > + * 'Astronomical' year numbering, and 1st January, 4713 B.C. in the > + * proleptic Julian calendar). This is also the first day of the 'Julian > + * Period' proposed by Joseph Scaliger in 1583, and the number of days > + * since this date is known as the 'Julian Day'. (It is not directly > + * to do with the Julian calendar, although this is where the name > + * is derived from.) > * > - * @return integer the number of days since the Date_Calc epoch > + * The algorithm is valid for all years (positive and negative), and > + * also for years preceding 4714 B.C. > * > - * @access public > + * @param int $day the day of the month > + * @param int $month the month > + * @param int $year the year (using 'Astronomical' year numbering) > + * > + * @return int the number of days since 24th November, 4714 B.C. > + * @access public > * @static > */ > function dateToDays($day, $month, $year) > { > - $century = (int)substr($year, 0, 2); > - $year = (int)substr($year, 2, 2); > if ($month > 2) { > + // March = 0, April = 1, ..., December = 9, > + // January = 10, February = 11 > $month -= 3; > } else { > $month += 9; > - if ($year) { > - $year--; > - } else { > - $year = 99; > - $century --; > - } > + --$year; > } > > - return (floor((146097 * $century) / 4 ) + > - floor((1461 * $year) / 4 ) + > - floor((153 * $month + 2) / 5 ) + > - $day + 1721119); > + $hb_negativeyear = $year < 0; > + $century = intval($year / 100); > + $year = $year % 100; > + > + if ($hb_negativeyear) { > + // Subtract 1 because year 0 is a leap year; > + // And N.B. that we must treat the leap years as occurring > + // one year earlier than they do, because for the purposes > + // of calculation, the year starts on 1st March: > + // > + return intval((14609700 * $century + ($year == 0 ? 1 : 0)) / 400) + > + intval((1461 * $year + 1) / 4) + > + intval((153 * $month + 2) / 5) + > + $day + 1721118; > + } else { > + return intval(146097 * $century / 4) + > + intval(1461 * $year / 4) + > + intval((153 * $month + 2) / 5) + > + $day + 1721119; > + } > } > > + > // }}} > // {{{ daysToDate() > > /** > - * Converts number of days to a distant unspecified epoch > + * Converts no of days since 24th November, 4714 B.C. (in the proleptic > + * Gregorian calendar, which is year -4713 using 'Astronomical' year > + * numbering) to Gregorian calendar date > * > - * @param int $days the number of days since the Date_Calc epoch > - * @param string $format the string indicating how to format the output > + * Returned date belongs to the proleptic Gregorian calendar, using > + * 'Astronomical' year numbering. > * > - * @return string the date in the desired format > + * The algorithm is valid for all years (positive and negative), and > + * also for years preceding 4714 B.C. (i.e. for negative 'Julian Days'), > + * and so the only limitation is platform-dependent (for 32-bit systems > + * the maximum year would be something like about 1,465,190 A.D.). > * > - * @access public > + * N.B. Monday, 24th November, 4714 B.C. is Julian Day '0'. > + * > + * @param int $days the number of days since 24th November, 4714 B.C. > + * @param string $format the string indicating how to format the output > + * > + * @return string the date in the desired format > + * @access public > * @static > */ > function daysToDate($days, $format = DATE_CALC_FORMAT) > { > + $days = intval($days); > + > $days -= 1721119; > $century = floor((4 * $days - 1) / 146097); > $days = floor(4 * $days - 1 - 146097 * $century); > $day = floor($days / 4); > > - $year = floor((4 * $day + 3) / 1461); > - $day = floor(4 * $day + 3 - 1461 * $year); > - $day = floor(($day + 4) / 4); > + $year = floor((4 * $day + 3) / 1461); > + $day = floor(4 * $day + 3 - 1461 * $year); > + $day = floor(($day + 4) / 4); > > - $month = floor((5 * $day - 3) / 153); > - $day = floor(5 * $day - 3 - 153 * $month); > - $day = floor(($day + 5) / 5); > + $month = floor((5 * $day - 3) / 153); > + $day = floor(5 * $day - 3 - 153 * $month); > + $day = floor(($day + 5) / 5); > > + $year = $century * 100 + $year; > if ($month < 10) { > $month +=3; > } else { > $month -=9; > - if ($year++ == 99) { > - $year = 0; > - $century++; > - } > + ++$year; > } > > - $century = sprintf('%02d', $century); > - $year = sprintf('%02d', $year); > - return Date_Calc::dateFormat($day, $month, $century . $year, $format); > + return Date_Calc::dateFormat($day, $month, $year, $format); > } > > + > // }}} > - // {{{ gregorianToISO() > + // {{{ getMonths() > > /** > - * Converts from Gregorian Year-Month-Day to ISO Year-WeekNumber-WeekDay > + * Returns array of the month numbers, in order, for the given year > * > - * Uses ISO 8601 definitions. Algorithm by Rick McCarty, 1999 at > - * http://personal.ecu.edu/mccartyr/ISOwdALG.txt . > - * Transcribed to PHP by Jesus M. Castagnetto. > + * @param int $pn_year the year (using 'Astronomical' year numbering) > * > - * @param int $day the day of the month > - * @param int $month the month > - * @param int $year the year. Use the complete year instead of the > - * abbreviated version. E.g. use 2005, not 05. > - * Do not add leading 0's for years prior to 1000. > + * @return array array of integer month numbers, in order > + * @access public > + * @static > + * @since Method available since Release 1.5.0 > + */ > + function getMonths($pn_year) > + { > + // N.B. Month numbers can be skipped but not duplicated: > + // > + return array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); > + } > + > + > + // }}} > + // {{{ getMonthNames() > + > + /** > + * Returns an array of month names > * > - * @return string the date in ISO Year-WeekNumber-WeekDay format > + * Used to take advantage of the setlocale function to return > + * language specific month names. > * > - * @access public > + * TODO: cache values to some global array to avoid performance > + * hits when called more than once. > + * > + * @param int $pb_abbreviated whether to return the abbreviated form of the > + * months > + * > + * @return array associative array of integer month numbers, in > + * order, to month names > + * @access public > * @static > */ > - function gregorianToISO($day, $month, $year) > + function getMonthNames($pb_abbreviated = false) > { > - $mnth = array (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334); > - $y_isleap = Date_Calc::isLeapYear($year); > - $y_1_isleap = Date_Calc::isLeapYear($year - 1); > - $day_of_year_number = $day + $mnth[$month - 1]; > - if ($y_isleap && $month > 2) { > - $day_of_year_number++; > + $ret = array(); > + foreach (Date_Calc::getMonths(2001) as $i) { > + $ret[$i] = strftime($pb_abbreviated ? '%b' : '%B', > + mktime(0, 0, 0, $i, 1, 2001)); > } > - // find Jan 1 weekday (monday = 1, sunday = 7) > - $yy = ($year - 1) % 100; > - $c = ($year - 1) - $yy; > - $g = $yy + intval($yy / 4); > - $jan1_weekday = 1 + intval((((($c / 100) % 4) * 5) + $g) % 7); > - // weekday for year-month-day > - $h = $day_of_year_number + ($jan1_weekday - 1); > - $weekday = 1 + intval(($h - 1) % 7); > - // find if Y M D falls in YearNumber Y-1, WeekNumber 52 or > - if ($day_of_year_number <= (8 - $jan1_weekday) && $jan1_weekday > 4){ > - $yearnumber = $year - 1; > - if ($jan1_weekday == 5 || ($jan1_weekday == 6 && $y_1_isleap)) { > - $weeknumber = 53; > + return $ret; > + } > + > + > + // }}} > + // {{{ prevMonth() > + > + /** > + * Returns month and year of previous month > + * > + * @param int $pn_month the month > + * @param int $pn_year the year (using 'Astronomical' year numbering) > + * > + * @return array array of year, month as integers > + * @access public > + * @static > + * @since Method available since Release 1.5.0 > + */ > + function prevMonth($pn_month, $pn_year) > + { > + $ha_months = Date_Calc::getMonths($pn_year); > + $hn_monthkey = array_search($pn_month, $ha_months); > + if (array_key_exists($hn_monthkey - 1, $ha_months)) { > + return array((int) $pn_year, $ha_months[$hn_monthkey - 1]); > + } else { > + $ha_months = Date_Calc::getMonths($pn_year - 1); > + return array($pn_year - 1, end($ha_months)); > + } > + } > + > + > + // }}} > + // {{{ nextMonth() > + > + /** > + * Returns month and year of next month > + * > + * @param int $pn_month the month > + * @param int $pn_year the year (using 'Astronomical' year numbering) > + * > + * @return array array of year, month as integers > + * @access public > + * @static > + * @since Method available since Release 1.5.0 > + */ > + function nextMonth($pn_month, $pn_year) > + { > + $ha_months = Date_Calc::getMonths($pn_year); > + $hn_monthkey = array_search($pn_month, $ha_months); > + if (array_key_exists($hn_monthkey + 1, $ha_months)) { > + return array((int) $pn_year, $ha_months[$hn_monthkey + 1]); > + } else { > + $ha_months = Date_Calc::getMonths($pn_year + 1); > + return array($pn_year + 1, $ha_months[0]); > + } > + } > + > + > + // }}} > + // {{{ addMonthsToDays() > + > + /** > + * Returns 'Julian Day' of the date the specified no of months > + * from the given date > + * > + * To subtract months use a negative value for the '$pn_months' > + * parameter > + * > + * @param int $pn_months months to add > + * @param int $pn_days 'Julian Day', i.e. the no of days since 1st > + * January, 4713 B.C. > + * > + * @return int 'Julian Day', i.e. the no of days since 1st January, > + * 4713 B.C. > + * @access public > + * @static > + * @since Method available since Release 1.5.0 > + */ > + function addMonthsToDays($pn_months, $pn_days) > + { > + if ($pn_months == 0) > + return (int) $pn_days; > + > + list($hn_year, $hn_month, $hn_day) = > + explode(" ", Date_Calc::daysToDate($pn_days, "%Y %m %d")); > + > + $hn_retmonth = $hn_month + $pn_months % 12; > + $hn_retyear = $hn_year + intval($pn_months / 12); > + if ($hn_retmonth < 1) { > + $hn_retmonth += 12; > + --$hn_retyear; > + } else if ($hn_retmonth > 12) { > + $hn_retmonth -= 12; > + ++$hn_retyear; > + } > + > + if (Date_Calc::isValidDate($hn_day, $hn_retmonth, $hn_retyear)) > + return Date_Calc::dateToDays($hn_day, $hn_retmonth, $hn_retyear); > + > + // Calculate days since first of month: > + // > + $hn_dayoffset = $pn_days - > + Date_Calc::firstDayOfMonth($hn_month, $hn_year); > + > + $hn_retmonthfirstday = Date_Calc::firstDayOfMonth($hn_retmonth, > + $hn_retyear); > + $hn_retmonthlastday = Date_Calc::lastDayOfMonth($hn_retmonth, > + $hn_retyear); > + > + if ($hn_dayoffset > $hn_retmonthlastday - $hn_retmonthfirstday) { > + return $hn_retmonthlastday; > + } else { > + return $hn_retmonthfirstday + $hn_dayoffset; > + } > + } > + > + > + // }}} > + // {{{ addMonths() > + > + /** > + * Returns the date the specified no of months from the given date > + * > + * To subtract months use a negative value for the '$pn_months' > + * parameter > + * > + * @param int $pn_months months to add > + * @param int $pn_day the day of the month, default is current local > + * day > + * @param int $pn_month the month, default is current local month > + * @param int $pn_year the year in four digit format, default is > + * current local year > + * @param string $ps_format string specifying how to format the output > + * > + * @return string the date in the desired format > + * @access public > + * @static > + * @since Method available since Release 1.5.0 > + */ > + function addMonths($pn_months, > + $pn_day, > + $pn_month, > + $pn_year, > + $ps_format = DATE_CALC_FORMAT) > + { > + if (is_null($pn_year)) { > + $pn_year = Date_Calc::dateNow('%Y'); > + } > + if (empty($pn_month)) { > + $pn_month = Date_Calc::dateNow('%m'); > + } > + if (empty($pn_day)) { > + $pn_day = Date_Calc::dateNow('%d'); > + } > + > + if ($pn_months == 0) > + return Date_Calc::dateFormat($pn_day, > + $pn_month, > + $pn_year, > + $ps_format); > + > + $hn_days = Date_Calc::dateToDays($pn_day, $pn_month, $pn_year); > + return Date_Calc::daysToDate(Date_Calc::addMonthsToDays($pn_months, > + $hn_days), > + $ps_format); > + } > + > + > + // }}} > + // {{{ addYearsToDays() > + > + /** > + * Returns 'Julian Day' of the date the specified no of years > + * from the given date > + * > + * To subtract years use a negative value for the '$pn_years' > + * parameter > + * > + * @param int $pn_years years to add > + * @param int $pn_days 'Julian Day', i.e. the no of days since 1st January, > + * 4713 B.C. > + * > + * @return int 'Julian Day', i.e. the no of days since 1st January, > + * 4713 B.C. > + * @access public > + * @static > + * @since Method available since Release 1.5.0 > + */ > + function addYearsToDays($pn_years, $pn_days) > + { > + if ($pn_years == 0) > + return (int) $pn_days; > + > + list($hn_year, $hn_month, $hn_day) = > + explode(" ", Date_Calc::daysToDate($pn_days, "%Y %m %d")); > + > + $hn_retyear = $hn_year + $pn_years; > + if (Date_Calc::isValidDate($hn_day, $hn_month, $hn_retyear)) > + return Date_Calc::dateToDays($hn_day, $hn_month, $hn_retyear); > + > + $ha_months = Date_Calc::getMonths($hn_retyear); > + if (in_array($hn_month, $ha_months)) { > + $hn_retmonth = $hn_month; > + > + // Calculate days since first of month: > + // > + $hn_dayoffset = $pn_days - Date_Calc::firstDayOfMonth($hn_month, > + $hn_year); > + > + $hn_retmonthfirstday = Date_Calc::firstDayOfMonth($hn_retmonth, > + $hn_retyear); > + $hn_retmonthlastday = Date_Calc::lastDayOfMonth($hn_retmonth, > + $hn_retyear); > + > + if ($hn_dayoffset > $hn_retmonthlastday - $hn_retmonthfirstday) { > + return $hn_retmonthlast... [truncated message content] |