[英]Carbon difference between two dates to get a decimal for hourly rate calculations
我正在使用 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
不幸的是, 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
}
這是使用 CarbonPeriod 的更完整的解決方案。
<?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;
}
}
有Carbon::floatDiffInDays()
應該適合您的需求
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.