Php 多少小时过去了

Php 多少小时过去了,php,date,datetime,Php,Date,Datetime,这个问题以这样或那样的形式被问到,但人们总是在寻找一个关于多少天/小时/分/秒过去的答案。我的问题不同,是的,我已经复习了其他问题。我正在进行一项编码任务,该任务的一部分要求我计算自上次登录以来已过了多少小时(仅小时而非分钟/秒)。因此,如果一名员工在早上9点登录,然后在下午4:30早早离开,这将是7.5个小时,我将使用SQL语句存储在表中 我该如何计算通过的总小时数?我尝试过以下方法,但我对这些东西并不擅长:- $start_time = "0900"; $now = date("Hi");

这个问题以这样或那样的形式被问到,但人们总是在寻找一个关于多少天/小时/分/秒过去的答案。我的问题不同,是的,我已经复习了其他问题。我正在进行一项编码任务,该任务的一部分要求我计算自上次登录以来已过了多少小时(仅小时而非分钟/秒)。因此,如果一名员工在早上9点登录,然后在下午4:30早早离开,这将是7.5个小时,我将使用SQL语句存储在表中

我该如何计算通过的总小时数?我尝试过以下方法,但我对这些东西并不擅长:-

$start_time = "0900";
$now = date("Hi");
$total_hours = $now - $start_time / 60;
正如我所说,这只给了我524,但现在我知道这是否正确,或者是否需要通过除法或其他方式进行转换


请提供帮助,提前感谢

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

你可以利用课堂来计算时差,以小时为单位

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

在代码中,初始化两个字符串变量,当进行减法运算时,PHP将其转换为整数

你可以利用课堂来计算时差,以小时为单位

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

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

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

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

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

代码存在多个问题:

  • $now-$start\u time/60
    未按预期方式计算,除法运算符的值高于减法运算符的值
    • 您需要使用括号来强制执行命令,如:
      ($now-$start\u time)/60
  • 将结果除以60是没有意义的,因为它不是以分钟为单位的,而是以HHMM格式的字符串

  • 您不能将登录时间存储为时间戳或日期时间列吗?这将更容易合作

    无论如何,要正确地执行此操作(在本例中),我将使用以下类:

    此代码打印自
    $start\u time
    以来的小时数(浮动)。如果现在在
    $start\u时间之前,则If将为负值

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

    float(5.8622222222222)
    
    float(-3.6580555555556)
    
    如果是05:20:31,结果将是:

    float(5.8622222222222)
    
    float(-3.6580555555556)
    

    代码存在多个问题:

  • $now-$start\u time/60
    未按预期方式计算,除法运算符的值高于减法运算符的值
    • 您需要使用括号来强制执行命令,如:
      ($now-$start\u time)/60
  • 将结果除以60是没有意义的,因为它不是以分钟为单位的,而是以HHMM格式的字符串

  • 您不能将登录时间存储为时间戳或日期时间列吗?这将更容易合作

    无论如何,要正确地执行此操作(在本例中),我将使用以下类:

    此代码打印自
    $start\u time
    以来的小时数(浮动)。如果现在在
    $start\u时间之前,则If将为负值

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

    float(5.8622222222222)
    
    float(-3.6580555555556)
    
    如果是05:20:31,结果将是:

    float(5.8622222222222)
    
    float(-3.6580555555556)
    

    我建议您使用Carbon—一个用于DateTime的简单PHP API扩展。我建议您使用结束时间戳-开始时间戳,以秒为单位获得总差异。。然后用3600除以它-就像@Mircha刚才回答的那样。:)我建议您使用Carbon—一个用于DateTime的简单PHP API扩展。我建议您使用结束时间戳-开始时间戳,以秒为单位获得总差异。。然后用3600除以它-就像@Mircha刚才回答的那样。:)但我如何才能做到这一点?请看,我没有将时间作为普通unix时间戳存储在数据库中。我试图通过将timeIn存储为date(“Hi”),然后将dateIn存储为date(“d-m-y”),使其尽可能简单。员工的开始时间显然是上午9点,存储为“0900”。在数学方面,日期和时间函数总是让我感到困惑,这是而且永远不会是我的强项。我认为最简单的方法是在数据库中实际存储完整的时间戳。否则,如果有人一天打卡,第二天打卡(开夜车),你就会遇到麻烦。@postrel非常感谢你!那很有效!非常感谢@MagnusEriksson啊,是的,这只是一个简短的编码任务,假设员工不迟于1730小时或下午5:30完成。已经有人告诉我,我可以做这个假设,并创建简单的时钟输入/时钟输出系统。我们的想法是,这不会是一项复杂的任务。@Dave,不客气。如果您想保留您的设计,请确保以正确的格式初始化$start,该格式将日期与时间关联起来,而不仅仅是时间。例如,
    DateTime::createFromFormat('HidmY','090018062016',$timeZone)如何实现这一点?请看,我没有将时间作为普通unix时间戳存储在数据库中。我试图通过将timeIn存储为date(“Hi”),然后将dateIn存储为date(“d-m-y”),使其尽可能简单。员工的开始时间显然是上午9点,存储为“0900”。在数学方面,日期和时间函数总是让我感到困惑,这是而且永远不会是我的强项。我认为最简单的方法是在数据库中实际存储完整的时间戳。否则,如果有人一天打卡,第二天打卡(开夜车),你就会遇到麻烦。@postrel非常感谢你!那很有效!非常感谢@MagnusEriksson啊,是的,这只是一个简短的编码任务,假设员工在