PHP 中的日期和时差无法正常工作
date and time difference not working properly in PHP
这里我想做员工登录时间的计算,比如
- 我的办公室登录时间是
2018-02-01 09:30 AM
- 但是我的登录时间
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
...
希望对您有所帮助。
参考:
这里我想做员工登录时间的计算,比如
- 我的办公室登录时间是
2018-02-01 09:30 AM
- 但是我的登录时间
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
...
希望对您有所帮助。
参考: