【问题标题】:Having a hard time understanding how to manipulate date and time in PHP很难理解如何在 PHP 中操作日期和时间
【发布时间】:2019-01-13 23:26:25
【问题描述】:

我真的不明白如何在 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 的默认 TIMESTAMP 格式。例如。 2018-08-06 17:38:37。

【问题讨论】:

  • 您不能只对日期进行数学运算并期望事情能够奏效。即使是像夏令时这样简单的事情也会导致你的代码在一个小时内做一些奇怪的事情,但最坏的情况是会让你的服务器崩溃。为此请使用一个库,该库是由那些花费数年时间确保日期数学确实符合预期的人编写的。
  • 您必须知道从数据库返回的格式,然后您可以使用 DateTime 类进行操作,请参阅此处的文档:php.net/manual/en/datetime.createfromformat.php
  • 这些答案之一是否解决了您的问题?如果是这样,请将其标记为已接受,以便其他用户可以找到它。如果不是,请添加一些信息以帮助解决问题。见stackoverflow.com/help/someone-answers

标签: php mysql math time


【解决方案1】:

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

抛弃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
}

【讨论】:

    【解决方案2】:

    您应该使用 PHP 中的DateTime 类来进行任何日期操作。您可以使用

    将 MySQL 格式时间的字符串表示形式转换为 PHP DateTime 对象
    $date = DateTime::createFromFormat('Y-m-d H:i:s', $mysqldate);
    

    您还可以使用不带参数的构造函数创建一个表示当前时间的 DateTime 对象:

    $now = new DateTime();
    

    要将两个日期之间的差异作为DateInterval 对象,请使用内置的 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 将不包括两个日期之间任何月份的天数(在此示例中,它将返回 3今天是 8 月 6 日)。

    【讨论】:

      【解决方案3】:

      在 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 日期的输入格式正确,在这种情况下,我假设为 dmy H:i:s,然后您也可以以您需要的任何格式输出,如日期文档中所示:http://php.net/manual/en/function.date.php

      【讨论】:

      • 数据库中的格式是创建条目时添加的默认时间戳,例如2018-08-06 17:38:37 我还从您的代码中收到以下错误:致命错误:在第 103 行的 C:\...file.php 中调用布尔值的成员函数 format()
      • 那是因为你的数据库值没有正确创建日期对象。您必须更新 ::createFromFormat 以匹配您的数据库,在本例中为 'Y-m-d H:i:s'
      猜你喜欢
      • 1970-01-01
      • 2013-06-14
      • 2019-09-26
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-18
      相关资源
      最近更新 更多