PHP中的时间差

6
我正在尝试创建一个考勤系统。 PHP中的考勤系统 在签出时,我调用一个函数来更新数据库中的出勤情况并计算小时数(使用Codeigniter)。
public function updateAttendance($data,$id)
    {
    date_default_timezone_set('Asia/Karachi');
    $attendance=array(
        'check_in'=> $data['check_in'],
        'check_out'=> $data['check_out']
    );
    $this->db->WHERE('id',$id)->update('attendance',$attendance);
    $this->db->query('UPDATE attendance SET hours=(HOUR(TIMEDIFF(check_out,check_in))-1) WHERE DATE(date)=\''.date('Y-m-d').'\' and employee_id='.$id);
    return true;
}

我通过员工ID获取我的考勤记录,并在员工个人资料中呈现如下视图。

Employee Attendance

问题在于我得到了错误的小时计算,可能是由于我的查询导致的。是否可以通过查询修复,还是我必须将时间差保留在时间格式中,然后在月底将它们全部加起来,然后从中获取小时数。

查询中的“-1”(HOUR(TIMEDIFF(check_out,check_in))-1)是必需的,因为公司从总工时中减去午餐时间。 - Mudassar Khani
你尝试过在显示结果时计算时间差,而不是从MySQL表中获取存储的“hour”列的表数据吗? - A B Catella
哦不,但是我也在考虑这样做。问题是,我在考勤表中有一个“小时”列,用于每天存储工作小时数。但是HOUR函数的INT属性只给我提供地板值,这浪费了每位员工每天很多分钟的时间。 - Mudassar Khani
4个回答

4
你可以尝试这个...
$to_time = strtotime("2008-12-13 10:42:00");
$from_time = strtotime("2008-12-13 10:21:00");
echo round(abs($to_time - $from_time) / 60,2). " minute";

将除以60替换为(60*60),并将分钟转换为小时。 - Pravin Durugkar
让我试试看是否有意义。谢谢@Pravin - Mudassar Khani
我试过了,结果在这里 http://prntscr.com/dswi9x @ Pravin。我猜我必须删除 round 函数并保留十进制格式的值。 - Mudassar Khani
根据公司/客户的需求,您可以使用类似round(2* ($end-$start)/(3600))/2的东西,它会将小时数四舍五入到最近的半小时(替换成4可将其四舍五入到最近的15分钟标记0、15、30、45)。 - Jhecht

1
$time = new DateTime($givenTime);
$time->diff(new DateTime());

尝试这段代码,可能会更好地帮助您。

1
我认为最好使用这个函数:

$ MY_TIME = strtotime('2017-01-04 23:12');

这行代码返回这些数字:1483571520

你可以对它们进行操作

你可以使用以下函数将它们转换为日期格式以便保存到数据库中:

date('y-m-d H:i',$MY_TIME);

你好,兄弟。我非常了解Unix时间戳和strtotime()函数。你是在说我应该将秒数存储在数据库中,然后减去它们以获得所需的小时数吗?那仍然会给我错误的答案。还有其他更好的解决方案吗? - Mudassar Khani
为什么会给你错误的答案?($end-$start)/(60*60)应该可以解决问题。 - Jhecht
我认为秒数不是必要的。 - nima
@jhecht,($end-$start)/(60*60) 完美地运行,我是在指 round() 函数。 - Mudassar Khani
prntscr.com/dswi9x 这是我现在看到的。 - Mudassar Khani
1
为什么不直接使用 floor()ceil()round()(根据实际情况选择最适合的函数)呢? - Jhecht

0

好的,这里有一个非常本地化的PHP函数可能会对你有所帮助。我曾经遇到过同样的问题,并用它解决了它。你不需要日期,只需要时间。

function timeDiff($time_start = null, $time_end = null, $hour_mode = true)
  {
    $to_time = strtotime($time_start);
    $from_time = strtotime($time_end);
    $hour = 0;

    if ($hour_mode) { // Outputs in hours i.e. 8.50, 10.32
      $hour = round(abs($to_time - $from_time) / 60 / 60, 1); 
    }
    else {
      $hour = round(abs($to_time - $from_time) / 60, 1); // Outputs in minutes i.e. 3360, 500
    }    

    if ($time_end < $time_start) {
        if ($hour_mode) {   
            $hour -= 24; // outputs in hours         
        }
        else {
            $hour -= 1440; // outputs in minutes
        }
    }

    return abs($hour);
  }

使用方法

echo timeDiff('01:00:00', '02:00:00'); // Outputs '1' in hourly format
echo timeDiff('01:00:00', '02:00:00', false); // Outputs '60' in minute format

只需将该函数复制并粘贴到您的 PHP 源代码中的任何位置,就完成了!希望这能帮到您!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接