Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP 4.4.8的日期问题_Php_Date_Time_Wordpress - Fatal编程技术网

PHP 4.4.8的日期问题

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")); 结果是

上周发布了一个2.0测试版的my Events Manager插件,它生成了一个事件列表。在众多的错误中,有一个我无法修复。这个bug似乎只在使用PHP4.4.8的测试人员服务器上出现;可以在PHP5上正常工作。 当我尝试使用
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值(可以理解,我正在看你,month
00
…)。我最终使用了echo(mysql2date(“H:I”,“2000-10-1013:24:00”)


因为我只是对时间和分钟感兴趣,一个更随意的约会就可以了。问题解决。

你能发布mysql2date或你的替代者的代码吗?我认为这不是apache/mysql的问题。我建议您在其中添加一行,以便在出现问题时记录该问题;检查mysql2date(…)==00:00(系统时间!=00:00)。记录所有相关变量。在继续之前,我会先检查参数值是什么;作为临时补丁,我添加了一个简单的substr()调用来解析时间,因此源变量完全正确。谢谢你的建议。实际上,我最终实现了另一个解决方案,但这也是一个好主意。