дата выпуска с PHP 4.4.8 - PullRequest
       15

дата выпуска с PHP 4.4.8

0 голосов
/ 16 марта 2009

На прошлой неделе вышла бета-версия 2.0 моего плагина Диспетчер событий, который генерирует список событий. Среди множества ошибок, плавающих вокруг, есть одна, которую я не могу исправить. Ошибка, кажется, проявляется только на сервере тестера с PHP 4.4.8; работает нормально на PHP 5. Когда я пытаюсь использовать формат времени H:i php, я всегда получаю полночь (00:00). Проблема связана с функцией WordPress mysql2date. Эта функция является оберткой для функции даты.
Я изолировал проблему и вставил это в шаблон сайта:

echo (mysql2date("H:i", "0000-00-00 13:24:00"));

Результат был

00:00

Сначала я подумал, что это ошибка WordPress, но потом я переписал свою функцию, чтобы сразу использовать 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;
}

Если вам интересно, вы можете скачать код моего плагина здесь , проблема в строке 613 events-manager.php.

Может ли это быть как-то связано с настройками PHP или apache?

Заранее спасибо за любые предложения.

Davide

Ответы [ 2 ]

0 голосов
/ 12 августа 2009

Думаю, я решил эту проблему. Проблема была 0000-00-00, по-видимому, недопустимое значение mysql2date времени в некоторых комбинациях PHP / MySql (вполне понятно, я смотрю на вас, месяц 00 ...). Я закончил, используя echo (mysql2date("H:i", "2000-10-10 13:24:00"));

Так как меня просто интересуют часы и минуты, более случайное свидание делает работу. Проблема решена.

0 голосов
/ 25 марта 2009

Не исправление, а альтернатива - используйте UNIX_TIMESTAMP в вашем операторе mysql вместо того, чтобы преобразовывать его впоследствии.

SELECT UNIX_TIMESTAMP (date_created) AS date

...