Index: trunk/kernel/include/adodb/adodb-time.inc.php =================================================================== diff -u -N -r535 -r3282 --- trunk/kernel/include/adodb/adodb-time.inc.php (.../adodb-time.inc.php) (revision 535) +++ trunk/kernel/include/adodb/adodb-time.inc.php (.../adodb-time.inc.php) (revision 3282) @@ -23,7 +23,9 @@ date() with adodb_date() gmdate() with adodb_gmdate() mktime() with adodb_mktime() - gmmktime() with adodb_gmmktime()45 + gmmktime() with adodb_gmmktime() + strftime() with adodb_strftime() + strftime() with adodb_gmstrftime() The parameters are identical, except that adodb_date() accepts a subset @@ -55,8 +57,8 @@ COPYRIGHT -(c) 2003 John Lim and released under BSD-style license except for code by jackbbs, -which includes adodb_mktime, adodb_get_gmt_different, adodb_is_leap_year +(c) 2003-2005 John Lim and released under BSD-style license except for code by +jackbbs, which includes adodb_mktime, adodb_get_gmt_diff, adodb_is_leap_year and originally found at http://www.php.net/manual/en/function.mktime.php ============================================================================= @@ -72,82 +74,155 @@ FUNCTION DESCRIPTIONS -FUNCTION adodb_getdate($date=false) +** FUNCTION adodb_getdate($date=false) Returns an array containing date information, as getdate(), but supports -dates greater than 1901 to 2038. +dates greater than 1901 to 2038. The local date/time format is derived from a +heuristic the first time adodb_getdate is called. + + +** FUNCTION adodb_date($fmt, $timestamp = false) - -FUNCTION adodb_date($fmt, $timestamp = false) - Convert a timestamp to a formatted local date. If $timestamp is not defined, the current timestamp is used. Unlike the function date(), it supports dates outside the 1901 to 2038 range. The format fields that adodb_date supports:
-a - "am" or "pm" -A - "AM" or "PM" -d - day of the month, 2 digits with leading zeros; i.e. "01" to "31" -D - day of the week, textual, 3 letters; e.g. "Fri" -F - month, textual, long; e.g. "January" -g - hour, 12-hour format without leading zeros; i.e. "1" to "12" -G - hour, 24-hour format without leading zeros; i.e. "0" to "23" -h - hour, 12-hour format; i.e. "01" to "12" -H - hour, 24-hour format; i.e. "00" to "23" -i - minutes; i.e. "00" to "59" -j - day of the month without leading zeros; i.e. "1" to "31" -l (lowercase 'L') - day of the week, textual, long; e.g. "Friday" -L - boolean for whether it is a leap year; i.e. "0" or "1" -m - month; i.e. "01" to "12" -M - month, textual, 3 letters; e.g. "Jan" -n - month without leading zeros; i.e. "1" to "12" -O - Difference to Greenwich time in hours; e.g. "+0200" -r - RFC 822 formatted date; e.g. "Thu, 21 Dec 2000 16:01:07 +0200" -s - seconds; i.e. "00" to "59" -S - English ordinal suffix for the day of the month, 2 characters; - i.e. "st", "nd", "rd" or "th" -t - number of days in the given month; i.e. "28" to "31" -T - Timezone setting of this machine; e.g. "EST" or "MDT" -U - seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) -w - day of the week, numeric, i.e. "0" (Sunday) to "6" (Saturday) -Y - year, 4 digits; e.g. "1999" -y - year, 2 digits; e.g. "99" -z - day of the year; i.e. "0" to "365" -Z - timezone offset in seconds (i.e. "-43200" to "43200"). - The offset for timezones west of UTC is always negative, - and for those east of UTC is always positive. + a - "am" or "pm" + A - "AM" or "PM" + d - day of the month, 2 digits with leading zeros; i.e. "01" to "31" + D - day of the week, textual, 3 letters; e.g. "Fri" + F - month, textual, long; e.g. "January" + g - hour, 12-hour format without leading zeros; i.e. "1" to "12" + G - hour, 24-hour format without leading zeros; i.e. "0" to "23" + h - hour, 12-hour format; i.e. "01" to "12" + H - hour, 24-hour format; i.e. "00" to "23" + i - minutes; i.e. "00" to "59" + j - day of the month without leading zeros; i.e. "1" to "31" + l (lowercase 'L') - day of the week, textual, long; e.g. "Friday" + L - boolean for whether it is a leap year; i.e. "0" or "1" + m - month; i.e. "01" to "12" + M - month, textual, 3 letters; e.g. "Jan" + n - month without leading zeros; i.e. "1" to "12" + O - Difference to Greenwich time in hours; e.g. "+0200" + Q - Quarter, as in 1, 2, 3, 4 + r - RFC 822 formatted date; e.g. "Thu, 21 Dec 2000 16:01:07 +0200" + s - seconds; i.e. "00" to "59" + S - English ordinal suffix for the day of the month, 2 characters; + i.e. "st", "nd", "rd" or "th" + t - number of days in the given month; i.e. "28" to "31" + T - Timezone setting of this machine; e.g. "EST" or "MDT" + U - seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) + w - day of the week, numeric, i.e. "0" (Sunday) to "6" (Saturday) + Y - year, 4 digits; e.g. "1999" + y - year, 2 digits; e.g. "99" + z - day of the year; i.e. "0" to "365" + Z - timezone offset in seconds (i.e. "-43200" to "43200"). + The offset for timezones west of UTC is always negative, + and for those east of UTC is always positive.Unsupported:
-B - Swatch Internet time -I (capital i) - "1" if Daylight Savings Time, "0" otherwise. -W - ISO-8601 week number of year, weeks starting on Monday + B - Swatch Internet time + I (capital i) - "1" if Daylight Savings Time, "0" otherwise. + W - ISO-8601 week number of year, weeks starting on Monday-FUNCTION adodb_gmdate($fmt, $timestamp = false) +** FUNCTION adodb_date2($fmt, $isoDateString = false) +Same as adodb_date, but 2nd parameter accepts iso date, eg. + adodb_date2('d-M-Y H:i','2003-12-25 13:01:34'); + + +** FUNCTION adodb_gmdate($fmt, $timestamp = false) + Convert a timestamp to a formatted GMT date. If $timestamp is not defined, the current timestamp is used. Unlike the function date(), it supports dates outside the 1901 to 2038 range. -FUNCTION adodb_mktime($hr, $min, $sec, $month, $day, $year) +** FUNCTION adodb_mktime($hr, $min, $sec[, $month, $day, $year]) Converts a local date to a unix timestamp. Unlike the function mktime(), it supports -dates outside the 1901 to 2038 range. Differs from mktime() in that all parameters -are currently compulsory. +dates outside the 1901 to 2038 range. All parameters are optional. -FUNCTION adodb_gmmktime($hr, $min, $sec, $month, $day, $year) +** FUNCTION adodb_gmmktime($hr, $min, $sec [, $month, $day, $year]) + Converts a gmt date to a unix timestamp. Unlike the function gmmktime(), it supports dates outside the 1901 to 2038 range. Differs from gmmktime() in that all parameters are currently compulsory. +** FUNCTION adodb_gmstrftime($fmt, $timestamp = false) +Convert a timestamp to a formatted GMT date. + +** FUNCTION adodb_strftime($fmt, $timestamp = false) + +Convert a timestamp to a formatted local date. Internally converts $fmt into +adodb_date format, then echo result. + +For best results, you can define the local date format yourself. Define a global +variable $ADODB_DATE_LOCALE which is an array, 1st element is date format using +adodb_date syntax, and 2nd element is the time format, also in adodb_date syntax. + + eg. $ADODB_DATE_LOCALE = array('d/m/Y','H:i:s'); + + Supported format codes: + +
+ %a - abbreviated weekday name according to the current locale + %A - full weekday name according to the current locale + %b - abbreviated month name according to the current locale + %B - full month name according to the current locale + %c - preferred date and time representation for the current locale + %d - day of the month as a decimal number (range 01 to 31) + %D - same as %m/%d/%y + %e - day of the month as a decimal number, a single digit is preceded by a space (range ' 1' to '31') + %h - same as %b + %H - hour as a decimal number using a 24-hour clock (range 00 to 23) + %I - hour as a decimal number using a 12-hour clock (range 01 to 12) + %m - month as a decimal number (range 01 to 12) + %M - minute as a decimal number + %n - newline character + %p - either `am' or `pm' according to the given time value, or the corresponding strings for the current locale + %r - time in a.m. and p.m. notation + %R - time in 24 hour notation + %S - second as a decimal number + %t - tab character + %T - current time, equal to %H:%M:%S + %x - preferred date representation for the current locale without the time + %X - preferred time representation for the current locale without the date + %y - year as a decimal number without a century (range 00 to 99) + %Y - year as a decimal number including the century + %Z - time zone or name or abbreviation + %% - a literal `%' character ++ + Unsupported codes: +
+ %C - century number (the year divided by 100 and truncated to an integer, range 00 to 99) + %g - like %G, but without the century. + %G - The 4-digit year corresponding to the ISO week number (see %V). + This has the same format and value as %Y, except that if the ISO week number belongs + to the previous or next year, that year is used instead. + %j - day of the year as a decimal number (range 001 to 366) + %u - weekday as a decimal number [1,7], with 1 representing Monday + %U - week number of the current year as a decimal number, starting + with the first Sunday as the first day of the first week + %V - The ISO 8601:1988 week number of the current year as a decimal number, + range 01 to 53, where week 1 is the first week that has at least 4 days in the + current year, and with Monday as the first day of the week. (Use %G or %g for + the year component that corresponds to the week number for the specified timestamp.) + %w - day of the week as a decimal, Sunday being 0 + %W - week number of the current year as a decimal number, starting with the + first Monday as the first day of the first week ++ ============================================================================= NOTES @@ -161,14 +236,81 @@ (page 428, xttotm.c _Ttotm() function). Plauger's algorithm will not work outside 32-bit signed range, so i decided not to implement it. -b. Iterate over a block of years (say 12) when searching for the -correct year. - -c. Implement daylight savings, which looks awfully complicated, see +b. Implement daylight savings, which looks awfully complicated, see http://webexhibits.org/daylightsaving/ CHANGELOG + +- 18 July 2005 0.21 +- In PHP 4.3.11, the 'r' format has changed. Leading 0 in day is added. Changed for compat. +- Added support for negative months in adodb_mktime(). + +- 24 Feb 2005 0.20 +Added limited strftime/gmstrftime support. x10 improvement in performance of adodb_date(). + +- 21 Dec 2004 0.17 +In adodb_getdate(), the timestamp was accidentally converted to gmt when $is_gmt is false. +Also adodb_mktime(0,0,0) did not work properly. Both fixed thx Mauro. + +- 17 Nov 2004 0.16 +Removed intval typecast in adodb_mktime() for secs, allowing: + adodb_mktime(0,0,0 + 2236672153,1,1,1934); +Suggested by Ryan. + +- 18 July 2004 0.15 +All params in adodb_mktime were formerly compulsory. Now only the hour, min, secs is compulsory. +This brings it more in line with mktime (still not identical). + +- 23 June 2004 0.14 + +Allow you to define your own daylights savings function, adodb_daylight_sv. +If the function is defined (somewhere in an include), then you can correct for daylights savings. + +In this example, we apply daylights savings in June or July, adding one hour. This is extremely +unrealistic as it does not take into account time-zone, geographic location, current year. + +function adodb_daylight_sv(&$arr, $is_gmt) +{ + if ($is_gmt) return; + $m = $arr['mon']; + if ($m == 6 || $m == 7) $arr['hours'] += 1; +} + +This is only called by adodb_date() and not by adodb_mktime(). + +The format of $arr is +Array ( + [seconds] => 0 + [minutes] => 0 + [hours] => 0 + [mday] => 1 # day of month, eg 1st day of the month + [mon] => 2 # month (eg. Feb) + [year] => 2102 + [yday] => 31 # days in current year + [leap] => # true if leap year + [ndays] => 28 # no of days in current month + ) + + +- 28 Apr 2004 0.13 +Fixed adodb_date to properly support $is_gmt. Thx to Dimitar Angelov. + +- 20 Mar 2004 0.12 +Fixed month calculation error in adodb_date. 2102-June-01 appeared as 2102-May-32. + +- 26 Oct 2003 0.11 +Because of daylight savings problems (some systems apply daylight savings to +January!!!), changed adodb_get_gmt_diff() to ignore daylight savings. + +- 9 Aug 2003 0.10 +Fixed bug with dates after 2038. +See http://phplens.com/lens/lensforum/msgs.php?id=6980 + +- 1 July 2003 0.09 +Added support for Q (Quarter). +Added adodb_date2(), which accepts ISO date in 2nd param + - 3 March 2003 0.08 Added support for 'S' adodb_date() format char. Added constant ADODB_ALLOW_NEGATIVE_TS if you want PHP to handle negative timestamps between 1901 to 1969. @@ -217,12 +359,11 @@ /* Version Number */ -define('ADODB_DATE_VERSION',0.08); +define('ADODB_DATE_VERSION',0.21); /* - We check for Windows as only +ve ints are accepted as dates on Windows. - - Apparently this problem happens also with Linux, RH 7.3 and later! + This code was originally for windows. But apparently this problem happens + also with Linux, RH 7.3 and later! glibc-2.2.5-34 and greater has been changed to return -1 for dates < 1970. This used to work. The problem exists with RedHat 7.3 and 8.0 @@ -235,30 +376,56 @@ if (!defined('ADODB_ALLOW_NEGATIVE_TS')) define('ADODB_NO_NEGATIVE_TS',1); -function adodb_date_test_date($y1,$m) +function adodb_date_test_date($y1,$m,$d=13) { - //print " $y1/$m "; - $t = adodb_mktime(0,0,0,$m,13,$y1); - if ("$y1-$m-13 00:00:00" != adodb_date('Y-n-d H:i:s',$t)) { - print "$y1 error
Testing gregorian <=> julian conversion
";
$t = adodb_mktime(0,0,0,10,11,1492);
//http://www.holidayorigins.com/html/columbus_day.html - Friday check
@@ -367,7 +534,7 @@
// we generate a timestamp, convert it to a date, and convert it back to a timestamp
// and check if the roundtrip broke the original timestamp value.
print "Testing $start to ".($start+$yrs).", or $max seconds, offset=$offset: ";
-
+ $cnt = 0;
for ($max += $i; $i < $max; $i += $offset) {
$ret = adodb_date('m,d,Y,H,i,s',$i);
$arr = explode(',',$ret);
@@ -382,8 +549,9 @@
$fail = true;
break;
}
+ $cnt += 1;
}
-
+ echo "Tested $cnt dates
";
if (!$fail) print "
Passed !
"; else print "Failed :-(
"; } @@ -416,13 +584,13 @@ $year--; } - $day = ( floor((13 * $month - 1) / 5) + + $day = floor((13 * $month - 1) / 5) + $day + ($year % 100) + floor(($year % 100) / 4) + floor(($year / 100) / 4) - 2 * - floor($year / 100) + 77); + floor($year / 100) + 77 + $greg_correction; - return (($day - 7 * floor($day / 7))) + $greg_correction; + return $day - 7 * floor($day / 7); } @@ -444,6 +612,7 @@ return true; } + /** checks for leap year, returns true if it is. Has 2-digit year check */ @@ -479,20 +648,18 @@ return $y; } - /** get local time zone offset from GMT */ -function adodb_get_gmt_different() +function adodb_get_gmt_diff() { -static $DIFF; - if (isset($DIFF)) return $DIFF; +static $TZ; + if (isset($TZ)) return $TZ; - $DIFF = mktime(0,0,0,1,2,2000) - gmmktime(0,0,0,1,2,2000); - return $DIFF; + $TZ = mktime(0,0,0,1,2,1970,0) - gmmktime(0,0,0,1,2,1970,0); + return $TZ; } - /** Returns an array with date info. */ @@ -508,14 +675,36 @@ return _adodb_getdate($d); } +/* +// generate $YRS table for _adodb_getdate() +function adodb_date_gentable($out=true) +{ + + for ($i=1970; $i >= 1600; $i-=10) { + $s = adodb_gmmktime(0,0,0,1,1,$i); + echo "$i => $s,