На прошлой неделе вышла бета-версия 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