Вычисление разницы во времени в Laravel

#php #laravel

#php #laravel

Вопрос:

Я начинающий веб-разработчик.

Я делаю свой веб-сайт в Laravel 5.8.

Это моя модель и миграция:

 class Timecycle extends Model
{

    protected $fillable = [
        'case_id',
        'timecycleable_id',
        'timecycleable_type',
        'status',
        'worked_time'
    ];

    protected $casts = [
        'id' => 'int',
        'case_id' => 'int',
    ];

    protected $dates = [
        'created_at',
        'updated_at'
    ];

    public function stopwatch()
    {
        return $this->morphTo();
    }


Schema::create('timecycles', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('timecycleable_id');
            $table->string('timecycleable_type');
            $table->integer('case_id')->unsigned();
            $table->foreign('case_id')->references('id')->on('case_instances')->onDelete('cascade');
            $table->boolean('status')->default(0);
            $table->integer('worked_time')->default(0);
            $table->timestamps();
        });
  

Контроллер:

 public function sync()
{
    $activeStopwatches = $this->getActiveStopwatches();
    foreach ($activeStopwatches as $activeStopwatch) {
        foreach ($activeStopwatch->timeCycle as $timeCycle) {
            $newTime = now() - $timeCycle->updated_at;
            $timeCycle->update(['worked_time' => $timeCycle->worked_time   $newTime]);
        }
    }
}

public function getActiveStopwatches()
    {
        return $this->stopwatch::with(['timeCycle' => function ($q) {
            $q->where('status', 1);
        }, 'caseInstance'])
            ->where('user_id', Auth()->user()->id)
            ->whereHas('timeCycle', function ($q) {
                $q->where('status', 1);
            })
            ->get();
    }
  

У меня есть метод, который отображает текущие секундомеры: getActiveStopwatches. Работает правильно. В функции sync () я хотел бы обновить worked_time. Итак: текущее время — дата последнего обновления, сохраните результат в worked_time.

Правильна ли эта запись для вычислений? Время, которое я хочу сохранить (переменная $ newTime), должно быть выражено в секундах.

Ответ №1:

@trzew Я надеюсь, что blow code поможет вам.

используйте Carbon Carbon;

 
 $newTime = now() - $timeCycle->updated_at; 
is not working fine , use time difference function to calculate difference   

$mytime = CarbonCarbon::now();
$totalDuration = $newTime->diffInSeconds($timeCycle->updated_at);
 gmdate('H:i:s', $totalDuration);
// 00:00:21

  

Ответ №2:

Вы не можете вычесть 2 даты таким образом, с помощью Carbon вы можете использовать этот ->diff() метод. Это вернет объект DateInterval.

Чтобы получить разницу в секундах, вы можете использовать ->diffInSeconds() метод.

 $newTime = now()->diffInSeconds($timeCycle->updated_at);
  

Или вычесть временные метки :

 now()->getTimestamp() - $timeCycle->updated_at->getTimestamp()