已经过了几个小时

时间:2016-06-18 12:32:47

标签: php date datetime

这个问题已经以一种或另一种形式提出,但人们一直在回答过了多少天/小时/分钟/秒。我的问题不同,是的,我已经回顾了其他问题。我正在编写一个编码任务,部分要求我计算自上次登录以来已经过了多少小时(仅几小时而不是几分钟/秒)。因此,如果员工在早上9点登记,然后在4点早些时候离开:下午30点,这将是7.5小时,然后我将使用SQL语句存储在表中。

我如何计算通过的总小时数?我尝试了以下但我对这些事情并不擅长: -

$start_time = "0900";
$now = date("Hi");
$total_hours = $now - $start_time / 60;

正如我所说,这只是给了我524但是现在知道这是否正确,或者是否需要通过分裂或其他东西来转换。

请提前帮助,请提供帮助

3 个答案:

答案 0 :(得分:1)

我会使用Unix时间戳(自1970年1月1日以来的秒数)来存储最后一次登录。从当前时间戳中减去上次登录时间戳,并将其除以3600秒以获得小时数。

$total_hours = (time() - $last_login) / 3600;

答案 1 :(得分:1)

代码存在多个问题:

  1. $now - $start_time / 60没有按照您期望的方式进行评估,除法运算符的值比减法运算符高precedence
    • 您需要使用括号来强制执行订单,例如:($now - $start_time) / 60
  2. 将结果除以60是没有意义的,因为它不是几分钟,而是一个HHMM格式的字符串
  3. 您不能将登录时间存储为时间戳或日期时间列吗?使用起来会容易得多。

    无论如何,为了做到这一点(在这种情况下),我使用DateTime类:

    $start_time = "0900";
    
    $start = DateTime::createFromFormat('Hi', $start_time);
    $now = new DateTime('NOW');
    $diff = $start->diff($now);
    $total_hours = ($diff->h * 3600 + $diff->i * 60 + $diff->s) / 3600 * ($diff->invert ? -1 : 1);
    
    var_dump($total_hours);
    

    此代码打印自$start_time以来的小时数(作为浮点数)。如果 NOW $start_time之前,则为否定。

    如果 14:51:44 ,结果将是:

    float(5.8622222222222)
    

    如果是 05:20:31 ,结果将是:

    float(-3.6580555555556)
    

答案 2 :(得分:0)

在您的代码中,初始化两个字符串变量,当您进行减法时,这些变量将由PHP转换为整数。

您可以使用DateTime课程来获得以小时为单位的时差。

$timeZone = new DateTimeZone('UTC');
$start = DateTime::createFromFormat('Hi', '0900', $timeZone);
$end = new DateTime('now', $timeZone);
$interval = $start->diff($end);
echo $interval->format('%h hours');