Углеродная разница между двумя датами для получения десятичной дроби для расчета почасовой ставки

Я использую Carbon для расчета времени между двумя датами. Я хотел бы иметь возможность взять разницу между двумя датами и определить время в десятичном формате, чтобы можно было рассчитать почасовую ставку. Из моего тестирования вызов -> diffInHours () дает мне часы между двумя датами в целых числах.

Например

$actual_start_at = Carbon::parse('2017-05-01 13:00:00');
$actual_end_at = Carbon::parse('2017-05-01 15:15:00');
return $actual_end_at->diffInHours($actual_start_at, true);

Возвращает

2

Я хотел бы что-то, что возвращается, чтобы получить 2 hours 15 minutes

2.25

2

Решение

К несчастью, diffInHours взять только два параметра. Может быть, вы можете попробовать diffInMinutes хотя, а затем получить значение, которое вам требуется оттуда?

Например,

$actual_start_at = Carbon::parse('2017-05-01 13:00:00');
$actual_end_at   = Carbon::parse('2017-05-01 15:15:00');
$mins            = $actual_end_at->diffInMinutes($actual_start_at, true);

dd($mins/60);

будет выводить

2.25

Кроме того, если вы используете diff() метод, он будет возвращать DateInterval объект вместо

$mins = $actual_end_at->diff($actual_start_at, true);

а потом dd($mins) будет выводить:

DateInterval {#913 ▼
+"y": 0
+"m": 0
+"d": 0
+"h": 2
+"i": 15
+"s": 0
+"f": 0.0
+"weekday": 0
+"weekday_behavior": 0
+"first_last_day_of": 0
+"invert": 0
+"days": 0
+"special_type": 0
+"special_amount": 0
+"have_weekday_relative": 0
+"have_special_relative": 0
}
1

Другие решения

Привет, я написал что-то близкое к тому, что вы описали.

Углерод Расчет часов в интервале от периода

<?php

use Carbon\Carbon;
use Carbon\CarbonPeriod;
use Carbon\CarbonInterval;

class PeriodInterval {
public function hoursIn() {
/**
* Time Periods
*/
$periods = [
'day' => [
'08:00:00',
'18:00:00'
],
'night' => [
'18:00:00',
'08:00:00'
],
'lunch' => [
'11:00:00',
'14:00:00'
]
];

/**
* Time Intervals
*/
$intervals = [
'parking' => [
'John Doe' => [
Carbon::createFromFormat('Y-m-d H:i:s', '2018-12-10 07:00:00'),
Carbon::createFromFormat('Y-m-d H:i:s', '2018-12-10 09:00:00')
],
'Jane Doe' => [
Carbon::createFromFormat('Y-m-d H:i:s', '2018-12-10 08:00:00'),
Carbon::createFromFormat('Y-m-d H:i:s', '2018-12-10 09:00:00')
],
'John Hope' => [
Carbon::createFromFormat('Y-m-d H:i:s', '2018-12-10 11:00:00'),
Carbon::createFromFormat('Y-m-d H:i:s', '2018-12-10 13:00:00')
],
'Jane Hope' => [
Carbon::createFromFormat('Y-m-d H:i:s', '2018-12-10 18:00:00'),
Carbon::createFromFormat('Y-m-d H:i:s', '2018-12-10 19:00:00')
]
]
];

/**
* Hours for Interval in Period
*/
function hoursForIntervalInPeriod(array $period, array $interval) {
$Period = new CarbonPeriod(array_shift($interval)->toDateTimeString(), '1 hour', array_pop($interval)->toDateTimeString());

return $Period->filter(function($date) use ($period) {
$period_starts = Carbon::createFromFormat('Y-m-d H:i:s', $date->format('Y-m-d') . ' ' . array_shift($period));
$period_ends = Carbon::createFromFormat('Y-m-d H:i:s', $date->format('Y-m-d') . ' ' . array_pop($period));

// Normal Period
if ($period_starts < $period_ends) {
return ($date >= $period_starts && $date < $period_ends);
}

// Inverted Period (Overnight)
if ($period_starts > $period_ends) {
return ($date >= $period_starts || $date < $period_ends);
}

return false;
})->count();
}

/**
* Map Everything
*/
$hours = array_map(function($interval, $interval_key) use ($periods) {
return array_map(function ($period, $period_key) use ($interval, $interval_key) {
return [ $interval_key . ucfirst($period_key) => array_map(function($interval_item, $interval_item_key) use ($period) {
/**
* Calculate Total Hours
*/
$total_hours = hoursForIntervalInPeriod($period, $interval_item);

return [ $interval_item_key => $total_hours ];
}, $interval, array_keys($interval)) ];
}, $periods, array_keys($periods));
}, $intervals, array_keys($intervals));

return $hours;
}
}
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector