Помощь Почему неправильно рассчитывается время доступа за 1 день?

  • Автор темы Автор темы alexein66
  • Дата начала Дата начала

alexein66

Мастер конкатенации
Разрушитель (V)
Сообщения
252
Реакции
128
Баллы
3 923
Есть плагин, который выдает доступ к платному контенту. В настройка тарифа указываю 1 день. После покупки почему-то получаю 3 часа вместо 1 дня

PHP:
function wau_setup_time( $data ) {

    $time = 0;

    $time += (isset( $data['year'] ) && $data['year']) ? $data['year'] * 31104000 : 0;
    $time += (isset( $data['month'] ) && $data['month']) ? $data['month'] * 2592000 : 0;
    $time += (isset( $data['day'] ) && $data['day']) ? $data['day'] * 86400 : 0;
    $time += (isset( $data['hour'] ) && $data['hour']) ? $data['hour'] * 3600 : 0;
    $time += (isset( $data['minute'] ) && $data['minute']) ? $data['minute'] * 60 : 0;

    return $time;
}

function wau_parse_time( $time ) {

    $data = array(
        'year'   => 0,
        'month'  => 0,
        'day'    => 0,
        'hour'   => 0,
        'minute' => 0
    );

    $data['year'] = round( $time / 31104000 );
    if ( $data['year'] < 0 )
        $data['year'] = 0;

    $sec_month        = $time - ($data['year'] * 31104000);
    $data['month']    = round( $sec_month / 2592000 );
    if ( $data['month'] < 0 )
        $data['month'] = 0;

    $sec_day     = $sec_month - ($data['month'] * 2592000);
    $data['day'] = round( $sec_day / 86400 );
    if ( $data['day'] < 0 )
        $data['day'] = 0;

    $sec_hour      = $sec_day - ($data['day'] * 86400);
    $data['hour']  = round( $sec_hour / 3600 );
    if ( $data['hour'] < 0 )
        $data['hour'] = 0;

    $sec_min         = $sec_hour - ($data['hour'] * 3600);
    $data['minute']  = round( $sec_min / 60 );
    if ( $data['minute'] < 0 )
        $data['minute'] = 0;

    return $data;
}

Выдача доступа

PHP:
if ( $access = $WAU_User->get_access_by_account( $account_id ) ) {

        $time = $access->access_time - (strtotime( current_time( 'mysql' ) ) - strtotime( $access->access_date ));

        $box .= '<div class="active-notice">';
        $box .= '<span>' . __( 'Ваша подписка активна!' ) . '</span>';
        $box .= '<span>' . __( 'Осталось' ) . ': ' . wau_time_to_strdate( $time ) . '</span>';
        $box .= '</div>';
    }
 
А что в функции wau_time_to_strdate?
 
А что в функции wau_time_to_strdate?
PHP:
function wau_time_to_strdate( $time ) {

    $timeData = wau_parse_time( $time );

    $parent     = false;
    $string     = '';

    if ( $timeData['year'] ) {
        $parent = true;
        $string .= $timeData['year'] . ' г. ';
    }

    if ( $timeData['month'] || $parent ) {
        $parent = true;
        $string .= $timeData['month'] . ' м. ';
    }

    if ( $timeData['day'] || $parent ) {
        $parent = true;
        $string .= $timeData['day'] . ' д. ';
    }

    if ( $timeData['hour'] || $parent ) {
        $string .= $timeData['hour'] . ' ч. ';
    }


    $string .= $timeData['minute'] . ' мин. ';

    return $string;
}
 
Получается определяется время на сервере и вычитается количество часов, которые уже прошли. На сервере 21.00. 24-21 = 3. Вот так почему-то считает он
 
Не видя всего кода, сказать трудно. Может у него логика другая, где время отсчёта идёт не от времени покупки, а от даты на сервере
PHP:
$time = $access->access_time - (strtotime( current_time( 'mysql' ) ) - strtotime( $access->access_date ));
//Получение текущей даты и времени
(strtotime( current_time( 'mysql' ) )
 //Получение даты до которого действует подписка
 strtotime( $access->access_date ))
Текущая дата минус дата окончания подписки
 
Последнее редактирование:
Не видя всего кода, сказать трудно. Может у него логика другая, где время отсчёта идёт не от времени покупки, а от даты на сервере
PHP:
$time = $access->access_time - (strtotime( current_time( 'mysql' ) ) - strtotime( $access->access_date ));
//Получение текущей даты и времени
(strtotime( current_time( 'mysql' ) )
 //Получение даты до которого действует подписка
 strtotime( $access->access_date ))
Текущая дата минус дата окончания подписки
Ну по ходу в этой функции обновляется доступ
PHP:
function wau_update_user_access( $user_id, $account_id, $access_time, $append = true ) {

    if ( $access = wau_get_user_access_by_account( $user_id, $account_id ) ) {

        if ( $append && wau_get_account_field( $account_id, 'is_prolong' ) ) {
            $access_time += $access->access_time;
        } else {
            $access_time += strtotime( current_time( 'mysql' ) ) - strtotime( $access->access_date );
        }

        $result = wau_update_access( $access->access_id, array(
            'access_time' => $access_time
            ) );

        $access_id = $access->access_id;
    } else {

        $access_id = wau_add_access( array(
            'user_id'         => $user_id,
            'account_id'     => $account_id,
            'access_time'     => $access_time
            ) );
    }

    do_action( 'wau_update_user_access', $access_id );

    return $access_id;
}
В БД все четко стоит

Screenshot_10.png
 
А если на сервере часовой пояс 0, а у юзера +7 или -7?
 
А если на сервере часовой пояс 0, а у юзера +7 или -7?
Хороший вопрос.

strtotime(current_time('mysql')) - strtotime($access->access_date): Разница между текущим временем и временем доступа, сохраненным в объекте $access.
current_time('mysql') возвращает текущее серверное время, основываясь на настройках времени сервера.

Что-то я запутался во времени. Нужно ли определять текущее время юзера?
 
Все оказалось банальнее. При оплате записывалась только дата вместо дата и времени оплаты, поэтому учитывался только дата и время сервера
Screenshot_11.png
 
Назад
Верх