PHP 中的日期和时差无法正常工作

date and time difference not working properly in PHP

这里我想做员工登录时间的计算,比如

  1. 我的办公室登录时间是2018-02-01 09:30 AM
  2. 但是我的登录时间2018-02-01 09:40 AM

根据以上两个日期我就职10 Mins late

假设我的登录时间 2018-02-01 10:40 AM (晚 1 小时 20 分钟)

My expected results (Mins late means)

10 Mins late

My expected results (Hrs late means)

1 Hrs late

I tried like this but it is not working properly

    date_default_timezone_set('UTC');
$officeTiming ="2018-02-01 09:30 AM";
$todaymyloginTime ="2018-02-01 09:40 AM";
$datetime1 = date_create($officeTiming);
$datetime2 = date_create($todaymyloginTime);
$interval = date_diff($datetime1, $datetime2);
$suffix = ' Late'; 
    if ($datetime1 > $datetime2) $suffix = ' Before';
    $time_diff= $interval->format('%h:%i:%s'); 
    $start_date = new DateTime($time_diff);
    $since_start = $start_date->diff(new DateTime(date("h:i:s")));
    if(intval($since_start->format('%h')) >= 1){
         $timeago = $since_start->format('%h hours'.$suffix);    
    }
    else if(intval($since_start->format('%i')) >= 1){
         $timeago = $since_start->format('%i minutes'.$suffix);  
    }
    else if(intval($since_start->format('%s')) >= 1){
         $timeago = $since_start->format('%s seconds'.$suffix); 
    }
    echo $timeago; 

我得到的答案是 4 小时迟到 但实际上我迟到了 20 分钟

My working code

$datetime1 = new DateTime('2018-02-01 09:30 AM');
 $datetime2 = new DateTime('2018-02-01 09:20 AM');
 $interval = $datetime1->diff($datetime2);
 $suffix = ' Late'; 
if ($datetime1 > $datetime2) $suffix = ' Before';

 if($interval->format('%h') ==0){
     echo $interval->format('%i')." Minutes".$suffix;
 }else{
    echo $interval->format('%h')." Hours".$suffix; 
  }

可能是您正在寻找这种东西:-

<?php
$datetime1 = new DateTime('2018-02-01 09:30:31 AM');
$datetime2 = new DateTime('2018-02-01 09:40:32 AM');
$interval = $datetime1->diff($datetime2);
if($interval->format('%h') ==0){
    echo $interval->format('%i')." Minutes".$interval->format('%s')." Seconds Late";
}else{
    echo $interval->format('%h')." Hours ".$interval->format('%i')." Minutes ".$interval->format('%s')." Seconds Late"; 
}
?>

输出:-

10 Minutes 1 Seconds Late

希望对您有所帮助!

好的,对由此产生的所有可能的时间响应进行编程可能会很麻烦,因为有很多方法可以用这样的词来表示之间的时间间隔:

刚才,一分钟前, x 小时前, y 天前...等等

一定有更好的方法来做到这一点吧?

那么介绍 Carbon,一个简单的 PHP API 就可以让您做到这一点。这是一个向您展示其工作原理的示例:

如果我没记错的话,你首先在你的项目文件夹中创建一个名为 carbon.php 的文件,然后添加它。

<?php

 namespace Carbon;

 class Carbon extends \DateTime {

 }

然后,在您的其他文件中,假设它是 index.php 文件,您将能够使用 diffForHumans() 函数按您想要的方式操作 DateTime。

<?php

// index.php

require “Carbon.php”;

$dt_logout = Carbon::createFromFormat('Y-m-d H:m:s', '2018-01-30 22:00:00');
$dt_logout2 = Carbon::createFromFormat('Y-m-d H:m:s', '2018-01-02 22:00:00');
$dt_now = Carbon::now();      // Assuming now is 2018-02-02 22:00:00

echo $dt_now->diffForHumans($dt_logout);    // prints 3 days ago
echo $dt_now->diffForHumans($dt_logout2);     // prints 1 month ago
echo $dt_now->diffForHumans($dt_logout2, true);     // prints 1 month

...

希望对您有所帮助。

参考: