PHP 4.4.8的日期问题
上周发布了一个2.0测试版的my Events Manager插件,它生成了一个事件列表。在众多的错误中,有一个我无法修复。这个bug似乎只在使用PHP4.4.8的测试人员服务器上出现;可以在PHP5上正常工作。 当我尝试使用PHP 4.4.8的日期问题,php,date,time,wordpress,Php,Date,Time,Wordpress,上周发布了一个2.0测试版的my Events Manager插件,它生成了一个事件列表。在众多的错误中,有一个我无法修复。这个bug似乎只在使用PHP4.4.8的测试人员服务器上出现;可以在PHP5上正常工作。 当我尝试使用H:Iphp时间格式时,我总是在午夜(00:00)。 问题在于wordpress函数mysql2date。此函数是日期函数的包装器。 我隔离了问题并将其插入网站模板: echo (mysql2date("H:i", "0000-00-00 13:24:00")); 结果是
H:I
php时间格式时,我总是在午夜(00:00)。
问题在于wordpress函数mysql2date。此函数是日期函数的包装器。我隔离了问题并将其插入网站模板:
echo (mysql2date("H:i", "0000-00-00 13:24:00"));
结果是
00:00
起初我认为这是一个wordpress bug,但后来我重写了我的函数,立即使用date()
。结果更奇怪,我得到的不是午夜,而是11:59。
非常奇怪的是,mysql2date和date似乎在插件的其他部分都能正常工作。另外,正如我所说的,我无法在我的服务器上重现这个错误,只有2个用户发出了信号
既然有人问我,下面是mysql2date代码;它是Wordpress的一部分:
/**
* Converts MySQL DATETIME field to user specified date format.
*
* If $dateformatstring has 'G' value, then gmmktime() function will be used to
* make the time. If $dateformatstring is set to 'U', then mktime() function
* will be used to make the time.
*
* The $translate will only be used, if it is set to true and it is by default
* and if the $wp_locale object has the month and weekday set.
*
* @since 0.71
*
* @param string $dateformatstring Either 'G', 'U', or php date format.
* @param string $mysqlstring Time from mysql DATETIME field.
* @param bool $translate Optional. Default is true. Will switch format to locale.
* @return string Date formated by $dateformatstring or locale (if available).
*/
function mysql2date( $dateformatstring, $mysqlstring, $translate = true ) {
global $wp_locale;
$m = $mysqlstring;
if ( empty( $m ) )
return false;
if( 'G' == $dateformatstring ) {
return gmmktime(
(int) substr( $m, 11, 2 ), (int) substr( $m, 14, 2 ), (int) substr( $m, 17, 2 ),
(int) substr( $m, 5, 2 ), (int) substr( $m, 8, 2 ), (int) substr( $m, 0, 4 )
);
}
$i = mktime(
(int) substr( $m, 11, 2 ), (int) substr( $m, 14, 2 ), (int) substr( $m, 17, 2 ),
(int) substr( $m, 5, 2 ), (int) substr( $m, 8, 2 ), (int) substr( $m, 0, 4 )
);
if( 'U' == $dateformatstring )
return $i;
if ( -1 == $i || false == $i )
$i = 0;
if ( !empty( $wp_locale->month ) && !empty( $wp_locale->weekday ) && $translate ) {
$datemonth = $wp_locale->get_month( date( 'm', $i ) );
$datemonth_abbrev = $wp_locale->get_month_abbrev( $datemonth );
$dateweekday = $wp_locale->get_weekday( date( 'w', $i ) );
$dateweekday_abbrev = $wp_locale->get_weekday_abbrev( $dateweekday );
$datemeridiem = $wp_locale->get_meridiem( date( 'a', $i ) );
$datemeridiem_capital = $wp_locale->get_meridiem( date( 'A', $i ) );
$dateformatstring = ' ' . $dateformatstring;
$dateformatstring = preg_replace( "/([^\\\])D/", "\\1" . backslashit( $dateweekday_abbrev ), $dateformatstring );
$dateformatstring = preg_replace( "/([^\\\])F/", "\\1" . backslashit( $datemonth ), $dateformatstring );
$dateformatstring = preg_replace( "/([^\\\])l/", "\\1" . backslashit( $dateweekday ), $dateformatstring );
$dateformatstring = preg_replace( "/([^\\\])M/", "\\1" . backslashit( $datemonth_abbrev ), $dateformatstring );
$dateformatstring = preg_replace( "/([^\\\])a/", "\\1" . backslashit( $datemeridiem ), $dateformatstring );
$dateformatstring = preg_replace( "/([^\\\])A/", "\\1" . backslashit( $datemeridiem_capital ), $dateformatstring );
$dateformatstring = substr( $dateformatstring, 1, strlen( $dateformatstring ) -1 );
}
$j = @date( $dateformatstring, $i );
/*
if ( !$j ) // for debug purposes
echo $i." ".$mysqlstring;
*/
return $j;
}
如果您感兴趣,可以下载我的插件代码,问题在events-manager.php的第613行
这是否与PHP或apache设置有关
提前谢谢你的建议
Davide不是一个补丁,而是另一个选择——在mysql语句中使用UNIX\u时间戳,而不是事后转换它
选择UNIX时间戳(
date\u created
)作为date
我想我已经解决了这个问题。问题是0000-00-00
,显然在某些PHP/MySql组合中不是有效的时间mysql2date值(可以理解,我正在看你,month00
…)。我最终使用了echo(mysql2date(“H:I”,“2000-10-1013:24:00”)代码>
因为我只是对时间和分钟感兴趣,一个更随意的约会就可以了。问题解决。你能发布mysql2date或你的替代者的代码吗?我认为这不是apache/mysql的问题。我建议您在其中添加一行,以便在出现问题时记录该问题;检查mysql2date(…)==00:00(系统时间!=00:00)。记录所有相关变量。在继续之前,我会先检查参数值是什么;作为临时补丁,我添加了一个简单的substr()调用来解析时间,因此源变量完全正确。谢谢你的建议。实际上,我最终实现了另一个解决方案,但这也是一个好主意。