很难理解如何在PHP中操作日期和时间

很难理解如何在PHP中操作日期和时间,php,mysql,math,time,Php,Mysql,Math,Time,我真的没有掌握如何在PHP中格式化日期和时间,以便在数学方程中使用。我的目标是这样 从数据库中获取日期和时间 // Get array for times in $sth = mysqli_query($conn,"SELECT * FROM ledger ORDER BY ID"); $timeins = array(); while($r = mysqli_fetch_assoc($sth)) { $timeins[] = $r["timein"]; //OR arr

我真的没有掌握如何在PHP中格式化日期和时间,以便在数学方程中使用。我的目标是这样

从数据库中获取日期和时间

// Get array for times in
$sth = mysqli_query($conn,"SELECT * FROM ledger ORDER BY ID");
$timeins = array();
while($r = mysqli_fetch_assoc($sth)) {
    $timeins[] = $r["timein"];
    //OR
    array_push($timeins, $r['timein']);
}
然后找到当前时间和数组中变量$timeins[0]之间的距离,然后将分钟、小时和天的差值放在单独的简单变量中,供以后使用。这些变量将在if语句中单独使用,以确定此人是否已度过一定的时间


编辑:从数据库返回的日期格式是MySQL的默认时间戳格式。例如2018-08-06 17:38:37

在php中使用DateTime类是获得准确结果的最佳方法

$dateNow = new DateTime('now');
$dateIn = DateTime::createFromFormat('d-m-Y H:i:s',  $timeins[0]);

$interval = $dateNow->diff($dateIn);

echo $interval->format('%d days, %h hours, %i minutes, %s seconds');
$deltaDays = $interval->d;
$deltaHours = $interval->h;
...

您必须确保DB date的输入格式是正确的,在这种情况下,我假设d-m-y H:I:s,然后您也可以以所需的任何格式输出,如日期文档所示:

也可以在SQL中执行日期时间操作,以天、小时、分钟为单位获取两个日期时间/时间戳值之间的差异。。。我们可以使用选择列表中的表达式,将结果作为结果集中的列返回

放弃
SELECT*
模式,并指定需要返回的表达式的显式列表:

$sql = "
SELECT t.id 
     , t.timein 
     , TIMESTAMPDIFF(DAY    ,t.timein,NOW()) AS diff_days
     , TIMESTAMPDIFF(HOUR   ,t.timein,NOW()) AS diff_hours
     , TIMESTAMPDIFF(MINUTE ,t.timein,NOW()) AS diff_minute
  FROM ledger t
 ORDER BY t.id ";

if( $sth = mysqli_query($conn,$sql) ) {
  // execution successful 
  ...
} else {
  // handle sql error
}
您应该使用PHP中的类来执行任何日期操作。可以使用以下命令将MySQL格式时间的字符串表示形式转换为PHP日期时间对象

$date = DateTime::createFromFormat('Y-m-d H:i:s', $mysqldate);
此外,您还可以使用无参数的构造函数创建表示当前时间的DateTime对象:

$now = new DateTime();
要将两个日期之间的差异作为对象获取,请使用内置的diff方法:

$diff = $now->diff($date);
作为一个完整的例子:

$now = new DateTime();
$mysqldate = '2018-04-03 12:30:01';
$date = DateTime::createFromFormat('Y-m-d H:i:s', $mysqldate);
$diff = $now->diff($date);
$diff_days = (int)$diff->format('%a');
$diff_hours = $diff->h;
$diff_minutes = $diff->m;
echo "$diff_days days, $diff_hours hours, $diff_minutes minutes";
输出:

125 days, 9 hours, 4 minutes

请注意,您必须使用
$diff->format(“%a”)
而不是
$diff->d
来获取两个日期之间的天数,因为
$diff->d
将不包括两个日期之间任何月份的天数(在本例中,今天是8月6日,它将返回3)。

您不能只对日期进行数学运算,并期望事情正常运行。即使是像夏令时这样简单的事情,充其量也会让你的代码在一个小时内做一些奇怪的事情,但最坏的情况是会让你的服务器停机。使用一个库来实现这一点,它是由那些花了数年时间来确保日期数学真正做到它应该做的事情的人编写的。你必须知道从数据库返回的格式,然后你可以使用DateTime类来操作,请看这里的文档:这些答案之一解决了你的问题吗?如果是,请将其标记为已接受,以便其他用户可以找到它。如果没有,请添加一些信息以帮助解决问题。See Format in the database是在创建条目时添加的默认时间戳,例如2018-08-06 17:38:37我还从您的代码中得到以下错误:致命错误:在C:\..file.php第103行的布尔值上调用成员函数Format(),这是因为没有使用您的DB值正确创建日期对象。您必须更新::createFromFormat以匹配您的数据库,在本例中为“Y-m-d H:i:s”