将dateTime对象转换为字符串

时间:2014-04-24 13:39:13

标签: php datetime

我在将日期时间对象转换为字符串时遇到问题,因此我可以通过指定数据类型的MySQLi预处理语句传递它。

我收到的错误是:

Catchable fatal error: Object of class DateTime could not be converted to string

此错误引用的行是我准备好的语句的执行。尽管尝试将Object转换为字符串,但仍然会收到此错误。下面我将粘贴我尝试解决此问题的主要方式。

1 - 使用铸造操作员:

$total_hours_calc = $time_diff->format('%h') + ($time_diff->format('%i'))/60;
$total_hours = (string)$total_hours_calc;

2 - 使用Print_r:

$total_hours_calc = $time_diff->format('%h') + ($time_diff->format('%i'))/60;
$total_hours = print_r($total_hours_calc, true)

3 - 连接解决方​​法:

$total_hours_calc = $time_diff->format('%h') + ($time_diff->format('%i'))/60;
$total_hours = $total_hours_calc . "";

所有这些尝试都会返回此问题开头所述的错误。

任何帮助,解决方案或魔术PHP函数都不为那些尚未在PHP领域实现黑带的人所知 - 非常感谢。

[请求]准备好的声明 -

$sql = "INSERT INTO shift ".
       "(uniqueid, shift_date, start_time, end_time, total_hours, rate_of_pay, addedBy, paidRate, totalPaid) ".
       "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)";

$stmt = $connection->prepare($sql);
$stmt->bind_param('sssssssss', $uniqueid, $shift_date, $start_time, $end_time, $total_hours, $rate_of_pay, $addedBy, $paidRate, $totalPaid); 
$stmt->execute();

所有错误中引用的行是:$stmt->execute();

5 个答案:

答案 0 :(得分:5)

根据php文档,DateTime本身并没有实现__toString()方法,这解释了你不断获得的异常。您可以自己扩展DateTime并实现__toString,前提是您使用的是PHP 5.2或更高版本。

class DateTimeExt extends DateTime
{
    public function __toString()
    {
        return $this->format("Y-m-d H:i:s");
    }
}

使用DateTimeExt替换bind_param调用中使用的所有DateTime实例,你应该是好的。

答案 1 :(得分:2)

我认为你通过关注$total_hours来查找错误的地方,$start_time已经是一个字符串(或者可以转换为字符串的整数)

the snippet you linked中,您将变量$end_timeDateTime从字符串更改为$start_time个对象,这会在您稍后尝试使用它们时抛出指示的错误在准备好的声明中 请参阅此代码段,该代码段正确打印diff值,但在打印DateTime对象$start_time时出现错误:https://eval.in/145608

我可以想到两种可能的解决方案:


在预准备语句中使用另一个变量作为$end_time$start_time = "9:00"; $end_time = "17:30"; $start_time = new DateTime($start_time); $end_time = new DateTime($end_time); $time_diff = date_diff($start_time,$end_time); $start_time_string = $start_time->format('Y-m-d H:i:s'); $end_time_string = $end_time->format('Y-m-d H:i:s'); $stmt->bind_param('sssssssss', $uniqueid, $shift_date, $start_time_string, $end_time_string, $total_hours, $rate_of_pay, $addedBy, $paidRate, $totalPaid); 的字符串值

DateTime

创建一个class DateTimeDb extends DateTime { public function __toString() { return $this->format('Y-m-d H:i:s'); } } $start_time = "9:00"; $end_time = "17:30"; $start_time = new DateTimeDb($start_time); $end_time = new DateTimeDb($end_time); $time_diff = date_diff($start_time,$end_time); $stmt->bind_param('sssssssss', $uniqueid, $shift_date, $start_time, $end_time, $total_hours, $rate_of_pay, $addedBy, $paidRate, $totalPaid); 的子类,实现__toString(),然后使用它。

{{1}}

答案 2 :(得分:0)

你不能添加两个字符串

  $total_hours_calc = intval($time_diff->format('%h'),10) + intval($time_diff->format('%i'),10)/60;

答案 3 :(得分:0)

在将值相加之前将值解析为INT

$total_hours_calc = (int)$time_diff->format('%h') + ((int)$time_diff->format('%i'))/60;

在使用之前将结果日期引用为字符串

$total_hours = "'".$total_hours_calc."'";

根据您的实施情况,可能有更好的方式来引用最后一个值 但$int .""通常是不够的;

答案 4 :(得分:0)

您可以使用DateTime类的格式方法:

$date = new DateTime('2014-01-01');
$result = $date->format('Y-m-d H:i:s');

如果格式失败,则返回FALSE:

if ($result) { // OK
   echo $result;
} 
else { // if format failed
  echo "Unknown Time";
}