2014-03-26 2 views
1

У меня есть эта функция, которая создает наборы для истечения чего-то. Функция принимает пару аргументов, которые имеют значения по умолчанию. Я делаю это так:Как установить DateInterval в php?

public static function blockAccount(
    $id, 
    $years = 0, 
    $months = 0, 
    $days = 0, 
    $hours = 0, 
    $minutes = 0, 
    $seconds = 0 
) { 
    // Determine expiry date for the block 
    $date = Text::getDateTime(); 
    $date->add(
     new \DateInterval(
      'P' . $years . 'Y' 
      . $months . 'M' 
      . $days . 'D' 
      . $hours . 'H' 
      . $minutes . 'I' 
      . $seconds . 'S' 
     ) 
    ); 
    $blockedExpiryDate = $date->format(Filter::FORMAT_MICRO_TIMESTAMP); 

    $accountModel = AccountModel::selectById($id); 
    $accountModel->setBlockedExpiryDate($blockedExpiryDate); 
    $accountModel->save(); 
} 

При выполнении этого с только год набора, я получаю сообщение об ошибке, говоря: DateInterval::__construct(): Unknown or bad format (P1Y0M0D0H0I0S).

Любые идеи, что я делаю неправильно здесь?

ответ

8

Вы упускаете T раньше времени элементов и минут должно быть M не I:

Если продолжительность содержит элементы времени, что часть спецификации предшествует буква Т.

$date->add(
    new \DateInterval(
     'P' . $years . 'Y' 
     . $months . 'M' 
     . $days . 'DT' 
     . $hours . 'H' 
     . $minutes . 'M' 
     . $seconds . 'S' 
    ) 
); 

Вы также можете сделать свой код умнее и просто опустить любые элементы даты/времени, которые имеют нулевые значения.

+0

Спасибо за предложение, но теперь я просто получаю сообщение об ошибке «DateInterval :: __ construct(): Неизвестный или плохой формат (P1Y0M0DT0H0I0S)». Любые другие идеи? – kramer65

+0

Минуты должны быть 'M' not' I' –

+0

Согласно документам PHP, M означает Месяцы, и я обозначаю Минуты: http://www.php.net/manual/en/class.dateinterval.php – kramer65

Смежные вопросы