phpdatediffmybb

PHP Date + days


I got something like this in MyBB and I want add 5 days to date ($datetime1) with one should be stored in $nowPlus5D. Moreover display in $leeft variable how much days, hours, minutes left. difference between (day bought + 5days ) - datenow

define("IN_MYBB", 1);
require_once "global.php";


$data_zakupu = $db->query("
    SELECT timestamp
    FROM ".TABLE_PREFIX."subs
    WHERE txn_id <> '' AND uid=".$mybb->user['uid']." ORDER BY lid DESC          LIMIT 1;
");


     $dat = $db->fetch_field($data_zakupu,"timestamp");
     $date_buy = date('d-m-Y H:i:s', $dat); // added h:i:s

    // Total bought
    echo '<br><hr>';
   echo 'Bought date - ' . $date_buy;
  echo '<br>';

 $datetime2 = new DateTime('now');
  $datetime1 = new DateTime($date_buy); 

 $interval = $datetime1->diff($datetime2);

  $nowPlus5D = $datetime1->add(new DateInterval('P5D'));
 echo '<hr><br>';
 echo 'Expiration date - ' . $nowPlus5D->format('%a days, %h hours, %i, minutes');
 echo '<br>';

 $leeft = $nowPlus5D->diff($datetime1);
 var_dump($leeft);
 echo '<br>';
 echo $left->format('%a days, %h hours, %i, minutes');

and I got that

Bought date - 20-12-2018 18:20:48

Expiration date - %pm 25pm1848, %06 062018000000Tue, 25 Dec 2018 18:20:48 +010048, %20, 12201200000031Europe/Warsaw48
  object(DateInterval)#14 (15) { ["y"]=> int(0) ["m"]=> int(0) ["d"]=> int(0) ["h"]=> int(0) ["i"]=> int(0) ["s"]=> int(0) ["weekday"]=> int(0) ["weekday_behavior"]=> int(0) ["first_last_day_of"]=> int(0) ["invert"]=> int(0) ["days"]=> int(0) ["special_type"]=> int(0) ["special_amount"]=> int(0) ["have_weekday_relative"]=> int(0) ["have_special_relative"]=> int(0) }

Fatal error: Call to a member function format() on integer in /stackoverflow.php on line 42

Solution

  • Your main issue is you are confusing a couple objects. Specifically DateInterval with DateTime. Formatting is one thing that differs.

    <?php
    $date_buy = '2018-12-15 10:05:22';
    
    $datetime2 = new DateTime('now');
    $datetime1 = new DateTime($date_buy); 
    
    $interval = $datetime1->diff($datetime2);    
    $nowPlus5D = $datetime1->add(new DateInterval('P5D'));
    
    //THIS IS A DATETIME OBJECT, NOT AN INTERVAL! NOTE FORMAT `Y-m-d H:i:s`
    echo 'Expiration date - ' . $nowPlus5D->format('d \d\a\y\s, H \h\o\u\r\s, i \m\i\n\u\t\e\s');
    
    
    
    var_dump($nowPlus5D);
    var_dump($datetime1);
    // ^ Notice those are the same? A result of `$nowPlus5D = $datetime1->add(new DateInterval('P5D'));`
    
    // and Intervals then are of course zeros...
    $left = $nowPlus5D->diff($datetime1);
    echo '<br>';
    echo $left->format('%a days, %h hours, %i, minutes');
    
    // could do this...
    $left = $nowPlus5D->diff(new \DateTime);
    echo $left->format('%a days, %h hours, %i, minutes');
    

    Anyway, think your main confusion was over the two object types. Imagine you can take it from here.