PHP Tally of hours is different when cross-checked with Google - laravel

I am calculating the sum of hours using PHP inside Laravel. When I cross check the result in Google, the results are different.
Here is my the code in the controller:
$times[] = '7:55';
$times[] = '7:55';
$minutes = 0;
foreach ($times as $time) {
list($hour, $minute) = explode(':', $time);
$minutes += $hour * 60;
$minutes += $minute;
}
$hours = floor($minutes / 60);
$minutes -= $hours * 60;
$tally = sprintf('%02d.%02d', $hours, $minutes);
dd($times, $tally);
The output is: "15.50";
but in google, the output is "15.1".
In Excel and Google Sheets, the output is also "15.50".
Which one is correct and how can I modify my code to reflect the same result as google.

15.1 is wrong, 15h 50m is correct. Time summing is not a mystery, you can check it manually: 7h 55m for example is 8h - 5m, so the sum of the 2 is 16h - 10m = 15h 50m.

Related

Getting non overlapping between two dates with Carbon

UseCase: Admin assigns tasks to People. Before we assign them we can see their tasks in a gantt chart. According to the task assign date and deadline, conflict days (overlap days) are generated between tasks.
I wrote this function to get overlapping dates between two dates. But now I need to get non overlapping days between two dates, below is the function I wrote.
$tasks = Assign_review_tasks::where('assigned_to', $employee)
->where('is_active', \Constants::$REVIEW_ACTIVE)
->whereNotNull('permit_id')->get();
$obj['task'] = count($tasks);
// count($tasks));
if (count($tasks) > 0) {
if (count($tasks) > 1) {
$start_one = $tasks[count($tasks) - 1]->start_date;
$end_one = $tasks[count($tasks) - 1]->end_date;
$end_two = $tasks[count($tasks) - 2]->end_date;
$start_two = $tasks[count($tasks) - 2]->start_date;
if ($start_one <= $end_two && $end_one >= $start_two) { //If the dates overlap
$obj['day'] = Carbon::parse(min($end_one, $end_two))->diff(Carbon::parse(max($start_two, $start_one)))->days + 1; //return how many days overlap
} else {
$obj['day'] = 0;
}
// $arr[] = $obj;
} else {
$obj['day'] = 0;
}
} else {
$obj['day'] = 0;
}
$arr[] = $obj;
start_date and end_date are taken from database,
I tried modifying it to,
(Carbon::parse((min($end_one, $end_two))->add(Carbon::parse(max($start_two, $start_one))))->days)->diff(Carbon::parse(min($end_one, $end_two))->diff(Carbon::parse(max($start_two, $start_one)))->days + 1);
But it didn't work, in simple terms this is what I want,
Non conflicting days = (end1-start1 + end2-start2)- Current overlapping days
I'm having trouble translate this expression . Could you help me? Thanks in advance
before trying to reimplement complex stuff I recommend you take a look at enhanced-period for Carbon
composer require cmixin/enhanced-period
CarbonPeriod::diff macro method is what I think you're looking for:
use Carbon\CarbonPeriod;
use Cmixin\EnhancedPeriod;
CarbonPeriod::mixin(EnhancedPeriod::class);
$a = CarbonPeriod::create('2018-01-01', '2018-01-31');
$b = CarbonPeriod::create('2018-02-10', '2018-02-20');
$c = CarbonPeriod::create('2018-02-11', '2018-03-31');
$current = CarbonPeriod::create('2018-01-20', '2018-03-15');
foreach ($current->diff($a, $b, $c) as $period) {
foreach ($period as $day) {
echo $day . "\n";
}
}
This will output all the days that are in $current but not in any of the other periods. (E.g. non-conflicting days)

getting hours and day difference between two dates in codeigniter

i am getting two dates as
$date1 = 2020-07-16 03:50:32
$date2 = 2017-01-25 09:43:53
i want to get the difference between thes two dates.
THe difference count hours until 24 hours and then days plus hours.
eg. 2 days and 5 hours.
THe code i tried is this
$createddate = date("d-m-Y H:i:s", strtotime($application['created_at']));
$approvedisapprovedate = date("d-m-Y H:i:s", strtotime($application['approved_at']));
$created = strtotime($createddate);
$approvedisapprove = strtotime($approvedisapprovedate);
$diff = $approvedisapprove - $created;
$days = floor($diff / (60 * 60 * 24));
$hours = round(($diff - $days * 60 * 60 * 24) / (60 * 60));
but it won't work.anybody suggest a solution.
You can use carbon for this. Carbon can make it simple to manipulate dates very efficiently not for only this task but many other related date.
Install carbon
{
"require": {
"nesbot/carbon": "^1.22"
}
}
Usage
$date->diffForHumans();
OR
$date->diffInDays();
In your case, you can try below code -
$createddate = Carbon::parse($application['created_at']);
$approvedisapprovedate = Carbon::parse($application['approved_at']);
//here is carbon magic
$createddate->diffInDays($approvedisapprovedate); //This will give you diff in number of days.
$createddate->diffForHumans($approvedisapprovedate); //This will give you diff which is readable by human. ex- 1 day 2 hours
You can refer Carbon.
Hope this will help for you.
I propose you the DateInterval::format function of php
like this:
$createddate = new DateTime('12-07-2020 12:10:01');
$approvedisapprovedate = new DateTime('16-07-2020 13:15:40');
$interval = $approvedisapprovedate->diff($createddate);
echo $interval->format('%a days %h hours %i minutes')."\n";
It goes back to this:
4 days 1 hours 5 minutes
I don't know the format of the date $application['created_at'] and $application['approved_at'] but I just put it there:
$createddate = new DateTime($application['created_at']);
$approvedisapprovedate = new DateTime($application['approved_at']);
$interval = $approvedisapprovedate->diff($createddate);
echo $interval->format('%a days %h hours %i minutes')."\n";
voici le lien de DateInterval::format :
https://www.php.net/manual/fr/dateinterval.format.php

Calculate the time difference of two rows in laravel

I want calculate time different between 2 row and calculate rank.
this is my code:
public function testtima($sid,$rid){
$calcs=users::where([['si',$sid]])->first();
$calcr=users::where([['ri',$rid]])->first();
$stime=$calcs['created_at'];
$rtime=$calcr['created_at'];
$show['stime']=$stime;
$show['rtime']=$rtime;
$show['now']=carbon::now();
return $show;
}
how can i calculate $rtime-$stime ?
Use Carbon's method, diffInSeconds, diffInDays or diffInMonths etc:
public function testtima($sid,$rid){
$stime = users::where('si',$sid)->first()->created_at;
$rtime = users::where('ri',$rid)->first()->created_at;
$diff = (new Carbon($stime))->diffInSeconds($rtime);
//$diff = (new Carbon($stime))->diffInDays($rtime);
return $diff;
}
$row1= "2007-03-24";
$row2= "2009-06-26";
$diff = abs(strtotime($row2) - strtotime($row1));
$years = floor($diff / (365*60*60*24));
$months = floor(($diff - $years * 365*60*60*24) / (30*60*60*24));
$days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));
printf("%d years, %d months, %d days\n", $years, $months, $days);

smarty, 1000 to 1K , 1000000 to 1M

I'm far from a programmer, just a webmaster and I've been trying to figure out how to get 1K instead of 1000.
After a long time I finally had something working:
function insert_viewer_count_format( $options ) {
return ($options['count'] >= 10 ? number_format($options['count'] / 1000, 2) . 'K' : 10);}
But.. now it's only showing up K, so 10 becomes 0.01K which is kinda silly..
Anybody knows how I can include an if statement in there? I'd also like 1M instead of 1000000.
Thanks a lot in advance, I really appreciate helping me on this!
Try this:
$options['count'] = 4000;
if ($options['count'] >= 1000 && $options['count'] % 1000 == 0 ) {
$result = ($options['count']/1000) . 'K';
} else {
$result = number_format($options['count'] / 1000, 2);
}

Timepicker that removes times as they're selected (ajax)

I'm building a booking form for a moving business that uses a calendar combined with a start and end time. I built the timepicker with Formidable Pro, and it allows me to check "unique" on time fields which automatically removes them on the selected date. However it doesn't automatically remove the times from within the range between start and end times (ie: if someone chooses to rent a truck from 1am-3am I need 1am,2am,and 3am to be removed from future options but right now it only removes 1am and 3am) . I need to write ajax to remove the in-between times from the options. I'm not sure where to begin. This is the current ajax_time_ options function. Any push in the right direction would be appreciated.
function ajax_time_options(){
global $frmpro_settings, $frmdb, $wpdb;
//posted vars = $time_field, $date_field, $step, $start, $end, $date, $clock
extract($_POST);
$time_key = str_replace('field_', '', $time_field);
$date_key = str_replace('field_', '', $date_field);
if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', trim($date)))
$date = FrmProAppHelper::convert_date($date, $frmpro_settings->date_format, 'Y-m-d');
$date_entries = FrmEntryMeta::getEntryIds("fi.field_key='$date_key' and meta_value='$date'");
$opts = array('' => '');
$time = strtotime($start);
$end = strtotime($end);
$step = explode(':', $step);
$step = (isset($step[1])) ? ($step[0] * 3600 + $step[1] * 60) : ($step[0] * 60);
$format = ($clock) ? 'H:i' : 'h:i A';
while($time <= $end){
$opts[date($format, $time)] = date($format, $time);
$time += $step;
}
if($date_entries and !empty($date_entries)){
$used_times = $wpdb->get_col("SELECT meta_value FROM $frmdb->entry_metas it LEFT JOIN $frmdb->fields fi ON (it.field_id = fi.id) WHERE fi.field_key='$time_key' and it.item_id in (". implode(',', $date_entries).")");
if($used_times and !empty($used_times)){
$number_allowed = apply_filters('frm_allowed_time_count', 1, $time_key, $date_key);
$count = array();
foreach($used_times as $used){
if(!isset($opts[$used]))
continue;
if(!isset($count[$used]))
$count[$used] = 0;
$count[$used]++;
if((int)$count[$used] >= $number_allowed)
unset($opts[$used]);
}
unset($count);
}
}
echo json_encode($opts);
die();
}

Resources