计算完成的工作时间

时间:2015-07-21 13:03:11

标签: php laravel time

您好我正在制作一个模块,用于计算用户在指定班次内完成的小时工作量。

例如$start = strtotime("15:00");3pm 2015-07-21当天$end = strtotime("06:00"); 6am 2015-07-22。如何根据登录和退出计算工作时间?我正在使用Laravel 5我创建了一个具有此结构的表loginhours

loginhours
->id
->user_id
->loginhours
->date
->timestamp
->status

但是没有任何逻辑如何实现这一点,那些表列可能是我记录事物或执行此任务所需要的。如果您有建议,您可以自由分享。基本上,他们可以在班次期间登录和注销,只需更新loginhours列。例如,他们使用2015-07-21 03:00:00的{​​{1}}时间戳登录,然后如果他们在3pm注销,他们的登录时间为4pm,那么他们会再次登录1.0然后退出7pm,这将是他们之前的登录时间5am of 2015-07-21 + 1.0,因为10.0。并且应该更新该用户的loginhours。

我希望检查位于我7pm 2015-07-20 - 5am 2015-07-21的{​​{1}}和postLogin()

2 个答案:

答案 0 :(得分:2)

好吧,你可以使用我认为与Laravel捆绑在一起的Carbon,或者你可以使用PHP DateTime(我认为这是Carbon使用的)。如果我没有弄错的话,他们都会计算日期之间的时差。

http://php.net/manual/en/datetime.diff.php

http://carbon.nesbot.com/docs/

答案 1 :(得分:0)

我实现了这一点。我创建了work_order_sessions,因此用户可以签入并签出工作单,然后计算工作单上的总工时。在您的情况下,您可以在工作人员登录时设置会话记录,设置开始时间,然后在他们注销时查找最后(打开)会话并设置结束时间。它需要一些原始MySQL来计算每个会话的小时差异,然后添加每个用户的总小时差异。这是一个片段和链接:

// Model WorkOrder.php

/**
 * Retrieves all of the users work order
 * sessions grouped by each user.
 *
 * @return mixed
 */
public function getUniqueSessions()
{
    $select = "TRUNCATE(ABS(SUM(TIME_TO_SEC(TIMEDIFF(work_order_sessions.in, work_order_sessions.out)) / 3600)), 2) as total_hours";

    $records = $this->sessions()
        ->select('user_id', DB::raw($select))
        ->groupBy('user_id')
        ->get();

    return $records;
}

https://github.com/stevebauman/maintenance/blob/master/src/Models/WorkOrder.php#L428

架构:

    Schema::create('work_order_sessions', function (Blueprint $table)
    {
        $table->increments('id');
        $table->timestamps();
        $table->integer('user_id')->unsigned();
        $table->integer('work_order_id')->unsigned();
        $table->dateTime('in');
        $table->dateTime('out')->nullable();

        $table->foreign('user_id')->references('id')->on('users')
            ->onUpdate('restrict')
            ->onDelete('cascade');

        $table->foreign('work_order_id')->references('id')->on('work_orders')
            ->onUpdate('restrict')
            ->onDelete('cascade');
    });