将dateTime对象转换为字符串



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

我收到的错误是:

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

这个错误所指的行是我准备好的语句的执行。尽管多次尝试将Object转换为字符串,但我仍然收到此错误。下面我将粘贴我试图解决这个问题的主要3种方法。

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();

根据php文档,DateTime并没有以本机方式实现__toString()方法,该方法解释了您不断遇到的异常。如果您使用的是php5.2或更高版本,您可以扩展DateTime并自己实现__toString。

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

将bind_param调用中使用的所有DateTime实例替换为DateTimeExt,应该会很好。

我认为你把注意力集中在$total_hours上看错了地方,它已经是一个字符串(或可以转换为字符串的整数)

在您链接的代码段中,您将变量$start_time$end_time从字符串更改为DateTime对象,这将在稍后尝试在准备好的语句中使用它们时引发指示的错误
请参阅此片段,它正确打印diff值,但在打印DateTime对象$start_time时出错:https://eval.in/145608

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


为准备好的语句中的$start_time$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); 

创建一个实现__toString()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); 

不能添加两个字符串

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

在求和之前将值解析为INT

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

并以字符串形式引用结果日期,然后使用

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

引用最后一个值可能有更好的方法。。根据您的实现,
但CCD_ 12通常是不够的;

您可以使用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";
}

相关内容

  • 没有找到相关文章

最新更新