ID: 28543
Updated by: [EMAIL PROTECTED]
Reported By: rjones-php-ibase-bug at ico dot viva dot org
-Status: Open
+Status: Bogus
Bug Type: InterBase related
Operating System: windows 2000 and Linux
PHP Version: 4.3.6
New Comment:
Apparently, the Windows and GNU implementations of strftime() behave
differently. Nothing we can do about that. You can use ibase_timefmt()
to change the way strftime() is applied.
BTW, your patch sucks. You're using tm_year, which holds the number of
years since 1900, and comparing it < 10, causing '1900' to be printed
as '0001900'. Please don't post untested crap here.
Previous Comments:
------------------------------------------------------------------------
[2004-05-27 16:54:47] rjones-php-ibase-bug at ico dot viva dot org
Description:
------------
This function does not work consistently on Linux and Windows 2000 with
dates with small years.
The strings it returns are
under Linux: "01/01/1"
under Windows: "01/01/0001"
I have traced this back:
ibase_fetch_row -> _php_ibase_fetch_hash -> _php_ibase_var_zval ->
strftime
in interbase.c at line 1919:
#if HAVE_STRFTIME
Z_STRLEN_P(val) = strftime(string_data,
sizeof(string_data),
format, &t);
#else
/* FIXME */
if (!t.tm_hour && !t.tm_min && !t.tm_sec) {
Z_STRLEN_P(val) = sprintf(string_data,
"%02d/%02d/%4d", t.tm_mon +
1, t.tm_mday, t.tm_year + 1900);
} else {
Z_STRLEN_P(val) = sprintf(string_data,
"%02d/%02d/%4d
%02d:%02d:%02d", t.tm_mon+1, t.tm_mday, t.tm_year + 1900, t.tm_hour,
t.tm_min, t.tm_sec);
}
#endif
As a work-around, I've used
#if HAVE_STRFTIME
// Make this consistent with PHP on windows.
// FixMe This should give consistent results for all years from 0001
onwards
if(t.tm_year < 10)
{
if (!t.tm_hour && !t.tm_min && !t.tm_sec) {
Z_STRLEN_P(val) = sprintf(string_data,
"%02d/%02d/000%d",
t.tm_mon + 1, t.tm_mday, t.tm_year+1900);
} else {
Z_STRLEN_P(val) = sprintf(string_data,
"%02d/%02d/000%d
%02d:%02d:%02d", t.tm_mon+1, t.tm_mday, t.tm_year+1900, t.tm_hour,
t.tm_min, t.tm_sec);
}
}
else
{
Z_STRLEN_P(val) = strftime(string_data,
sizeof(string_data),
format, &t);
}
#else
/* FIXME */
if (!t.tm_hour && !t.tm_min && !t.tm_sec) {
Z_STRLEN_P(val) = sprintf(string_data,
"%02d/%02d/%4d", t.tm_mon +
1, t.tm_mday, t.tm_year + 1900);
} else {
Z_STRLEN_P(val) = sprintf(string_data,
"%02d/%02d/%4d
%02d:%02d:%02d", t.tm_mon+1, t.tm_mday, t.tm_year + 1900, t.tm_hour,
t.tm_min, t.tm_sec);
}
#endif
Reproduce code:
---------------
$rs_temp=ibase_query("SELECT time_stamp_field FROM
some_stored_procedure()");
$row_temp=ibase_fetch_row($rs_temp);
print($row_temp[0]);
Expected result:
----------------
01/01/0001
Actual result:
--------------
01/01/1
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=28543&edit=1