在PHP中提交包含两个日期字段并使用date_diff()的表单时出错

iswrvxsc  于 2023-05-27  发布在  PHP
关注(0)|答案(2)|浏览(120)

大家好,我提交了一个有两个字段的形式“时间_在”和“时间_出”
我尝试使用date_diff()获取两个日期之间的差异,我确保数据库中的time_in是DATE格式,time_out是DATE格式,两者都不是字符串
我得到这个错误:致命错误:未捕获的类型错误:date_diff0:参数#1(SbaseObject)必须是DateTimelnterface类型,字符串在C:\ampp\htdocs\aicAdmin\scripts\backend-script中给出。php:97堆栈跟踪:2019 - 05- 19,2023 - 05-23#1(main]throwninC:\xampp\htdocs\aicAdmin\scripts\backend-script.phponline97
而我的代码是

<div class="col">
            <div class="form-group">
                <input type="date"  class="form-control"  placeholder="Enter Time in" name="time_in" value="<?php echo $time_in; ?>">
            </div>
        </div> 

    <div class="col">
            <div class="form-group">
                <input type="date"  class="form-control"  placeholder="Enter Time out" name="time_out" value="<?php echo $time_in; ?>">
            </div>
        </div>

在后端代码中

if(empty($_GET['id']) && !empty($_GET['name']) && $_GET['name']=='current_job'){
   extract($_POST);
  if(!empty($jobnumber)){
   

      $data= [
        'jobnumber'=>$jobnumber,
       'revison' =>$revison,
       'groupp'=>$groupp,
       'checker'=>$checker,
       'releasedate'=> $releasedate,
       'quote_number'=> $quote_number,
       'building_number'=>$building_number,
       'task'=>$task,
       'designer_ca'=>$designer_ca,
       'designer_name'=>$designer_name,
       'time_in'=>$time_in,
       'time_schedule'=>$time_schedule,
       'time_out'=>$time_out,
       'spent_time'=>date_diff($time_out,$time_in),   
       'quote_weight'=>$quote_weight,
       'job_weight'=>$job_weight,
       'cycle_time'=>$cycle_time,
       'chk_time'=>$chk_time,
       'wd'=>$wd,
       'remarks'=>$remarks

       
     ];
  

    $tableName=$_GET['name']; 

    if(!empty($data) && !empty($tableName)){
       $insertData=insert_data($data,$tableName);
       if($insertData){
         echo "<span class='success'>Current Job Was saved sucessfully</span>";
       }else{
         echo "<span class='fail'>Error!.. check your query</span>";
       }
    }

}else{
  echo "<span class='fail'>Current Job field is empty</span>";
}

}

我没有复制整个表单代码只是一个片段我怎么能修复这个请??
我仔细检查了数据库中的time_in和time_out是否以DATE格式存储,我希望一切正常

yyyllmsg

yyyllmsg1#

他们在这里没有足够的信息来真正回答这个问题。
但是从错误中看,问题似乎是你的time_in和time_out不是DateTime对象。
您必须首先将它们推过DateTime:CreateFromFormat。这将使它们成为DateTime对象。date_diff将为您获取一个DateInterval对象,但该对象仍然无法干净地存储在数据库中。
考虑使用unix epoch时间戳。

$datetime_in = DateTime::createFromFormat('h:i a', $form_time_in); 
$datetime_out = DateTime::createFromFormat('h:i a', $form_time_out);
$seconds_elapsed = $datetime_out->format('U') - $datetime_in->format('U');

注意:'h:i a'需要格式“1:30 am”,请参阅其他选项here

soat7uwm

soat7uwm2#

我想可能需要更多的背景知识来完全回答你的问题,但是,我假设你正在经历一个类似的问题,我去年用这个函数做了什么。
为了测试这一点,我建议尝试回显您的日期变量。如果它起作用,那么它们是错误的数据类型,因为要使diff方法起作用,参数需要是Object而不是String。
这里有两种方法可以获得所需的数据类型。

$start_date= new DateTimeImmutable('2009-10-11');
$end_date= new DateTimeImmutable('2009-10-13');
$interval = $origin->diff($target);
echo $interval->format('%R%a days');

或者你可以这样做。

$time_out= new DateTime('today');
$time_in= new DateTime('tomorrow');
$interval = date_diff($time_out, $time_in);
echo $interval->format('%R%a days');

另外,我建议使用文档here

相关问题