Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

PHP Fatal error: Uncaught Error: Call to a member function diff() on string in

I have order date time stored in mysql database.
I am getting it. Now I am converting it to users local timezone and then adding 1 day in it.

Now What I am looking to do is getting how many hours and minutes remain in above date time in compare of current localtime of user. My code is like below

$timestamp_pending_accept = strtotime($pending_accept_row['order_time']);
$order_expiry_date = date('Y-m-d H:i:s', strtotime('+1 day', $timestamp_pending_accept));
$local_time = convert_timezone($order_expiry_date,$_SESSION['user_timezone'],SERVER_TIMEZONE);
$datetime = new DateTime();
$timezone = new DateTimeZone($_SESSION['user_timezone']);
$datetime->setTimezone($timezone);
$now = $datetime->format('Y-m-d H:i:s');
$interval = $order_expiry_date->diff($now);
$remaining_time = $interval->format("%h h, %i m");
echo $remaining_time;

But its giving me error called

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

PHP Fatal error:  Uncaught Error: Call to a member function diff() on string in

I am not getting idea how to solve the issue, Let me know if anyone here can help me for do the same.

Thanks!

>Solution :

The Fatal error raises in this line:

<?php
$interval = $order_expiry_date->diff($now);

It means that you try to call diff method of object, but $order_expiry_date has type of string.

Add debug statement before the line to ensure:

<?php 
var_dump($order_expiry_date);exit;
$interval = $order_expiry_date->diff($now);

It should output something like string(19) "2021-06-26 15:55:32".

To fix the error, you should do some steps:

  1. Convert $order_expiry_date from string to DateTime object.
  2. Replace $now argument (its type is also string) with Datetime object

Result is below:

<?php
/* region for demonstration */
$pending_accept_row['order_time'] = '2021-06-25 15:55:32';

$_SESSION['user_timezone'] = 'UTC';
define('SERVER_TIMEZONE', 'UTC');

function convert_timezone($date, $user_timezone, $server_timezone) {
  return $date;
}
/* endregion */

$timestamp_pending_accept = strtotime($pending_accept_row['order_time']);
$order_expiry_date = date('Y-m-d H:i:s', strtotime('+1 day', $timestamp_pending_accept));
$local_time = convert_timezone($order_expiry_date,$_SESSION['user_timezone'],SERVER_TIMEZONE);
$datetime = new DateTime();
$timezone = new DateTimeZone($_SESSION['user_timezone']);
$datetime->setTimezone($timezone);
// no need to convert DateTime to string
// $now = $datetime->format('Y-m-d H:i:s');

$order_expiry_date = DateTime::createFromFormat('Y-m-d H:i:s', $order_expiry_date);
// $interval = $order_expiry_date->diff($now);
$interval = $order_expiry_date->diff($datetime);
$remaining_time = $interval->format("%h h, %i m");
echo $remaining_time;

Live demo on PHP sandbox.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading