How to get 1st, 2nd, 3rd week format carbon laravel - laravel

I need to get 1st, 2nd, 3rd and 4th week format from CarbonPeriod. What should i do to make it in text?
$carbonPeriod = CarbonPeriod::create($startDate, '1 week', $endDate);
foreach ($carbonPeriod as $period) {
$startPeriod = clone $period;
$endPeriod = clone $period;
$startRange = $parsedStartDate->gt($startPeriod->startOfWeek()) ? $startDate : $startPeriod->startOfWeek()->format('Y-m-d');
$endRange = $parsedEndDate->lt($endPeriod->endOfWeek()) ? $endDate : $endPeriod->endOfWeek()->format('Y-m-d');
$labels[] = $period->translatedFormat('F D Y'); //i need Jan 1st week 2021, Jan 2nd week 2021 and etc for the labels
}

$carbonPeriod = CarbonPeriod::create($startDate, '1 week', $endDate);
foreach ($carbonPeriod as $index => $period) {
$startPeriod = clone $period;
$endPeriod = clone $period;
$startRange = $parsedStartDate->gt($startPeriod->startOfWeek()) ? $startDate : $startPeriod->startOfWeek()->format('Y-m-d');
$endRange = $parsedEndDate->lt($endPeriod->endOfWeek()) ? $endDate : $endPeriod->endOfWeek()->format('Y-m-d');
$labels[] = $carbonPeriod->translate('ordinal', [':number' => $index + 1]);
}

If I understand you correctly you want the ordinal week within the given period. If that's indeed the case then you can do what you need using:
$locale = 'xxx'; // Replace with your locale here
$nf = new NumberFormatter($locale, NumberFormatter::ORDINAL);
$carbonPeriod = CarbonPeriod::create($startDate, '1 week', $endDate);
foreach ($carbonPeriod as $i => $period) {
$startPeriod = clone $period;
$endPeriod = clone $period;
$startRange = $parsedStartDate->gt($startPeriod->startOfWeek()) ? $startDate : $startPeriod->startOfWeek()->format('Y-m-d');
$endRange = $parsedEndDate->lt($endPeriod->endOfWeek()) ? $endDate : $endPeriod->endOfWeek()->format('Y-m-d');
$ordWeek = $nf->format($i);
$labels[] = $period->translatedFormat('F')." $ordWeek". __("week")." ".$period->translatedFormat('Y'); // Should say "January 1st week 2021
}
Note this requires the intl extension

$CarbonPeriod = Carbon::now()->subDays(20);
$today = Carbon::now();
$weeks = intval(floor(($CarbonPeriod->diff($today)->days) / 7)) . 'st';
Result "2st"

Related

Add two times laravel

I have two times $first = 16 (seconds or minutes) & $second = 10 (seconds or minutes)
What i want to achieve - I want to add this two times like $result = $first + $second & the result is in seconds & minutes formet
like
$first = 16 seconds;
$second = 2 minutes;
$result = $first + $second; // 2 minutes, 16 seconds
so, how can we do this in code
I have this refrence code to get the time interval of two times
$in1 = explode(' ', "clock in time = 20 minutes");
$out1 = explode(' ', "clock out time = 10 minutes");
$start_time1 = $in1[4] . ' ' . $in1[5];
$end_time1 = $out1[4] . ' ' . $out1[5];
$start1 = Carbon::parse($start_time1);
$end1 = Carbon::parse($end_time1);
$dd1 = $end1->diffForHumans($start1, [
'parts' => 2,
'join' => ', ',
'syntax' => CarbonInterface::DIFF_ABSOLUTE,
]);
Carbon intervals allow you to create an interval instance from strings like 20 minutes or 10 seconds so you can leverage that with some date operations to get what you need:
$in1 = explode('=', "clock in time = 20 minutes");
$out1 = explode('=', "clock out time = 10 minutes");
$startinterval = CarbonInterval::fromString(trim($in1[1]));
$endinterval = CarbonInterval::fromString(trim($out1[1]));
$now = CarbonImmutable::now();
$interval = $now->add($startinterval)->add($endinterval)->diffAsCarbonInterval($now);
You can convert your times in seconds, do the addition, then convert to time again.
$start = $in1[5] === 'seconds' ? $int1[4] : $int1[4] * 60;
$end = $out1[5] === 'seconds' ? $out1[4] : $out1[4] * 60;
$totalInSeconds = (int) $start + (int) $end;
$dd1 = gmdate('i', $totalInSeconds) .' minutes, '. gmdate('s', $totalInSeconds) .' seconds';
echo $dd1;

Difference between two dates in Laravel

I have a problem with difference between two days.
How is it possible to get number of days?
Here is my code,
$start = date('Y-m-d', strtotime("+1 day"));
$end = date('Y-m-d', strtotime("+7 day"));
I use Pure PHP :
$start = date('Y-m-d', strtotime("+1 day"));
$end = date('Y-m-d', strtotime("+7 day"));
$diff = abs(strtotime($start) - strtotime($end));
$days = floor($diff/60/60/24);
$total = sprintf("%d days\n", $days);
return $total; // 6 days

How to split date and time from a string like 8/29/2011 1:00 PM in laravel

in my blade there is a DateTime picker which selects in mm/dd/yyyy hh:mm AM/PM format. and i need to extract this to date = 8/29/2011 and time = 13:00 .
how can I do that?
Do as below.
$stringdate = "8/29/2011 1:00 PM";
$timestemp = strtotime($stringdate);
$date = date('Y-m-d', $timestemp);
$time = date('H:i:s',$timestemp);
echo $date;
echo $time;
check example
Edit:- as you want this format YYYY-MM-DD hh:mm
$datetime = date('Y-m-d H:i', strtotime("8/29/2011 1:00 PM"));
echo $datetime; //output "2011-08-29 13:00";
Try this way.
#php
$input = '2017-06-27 12:58:20';
$format1 = 'Y-m-d';
$format2 = 'H:i:s';
$date = Carbon\Carbon::parse($input)->format($format1);
$time = Carbon\Carbon::parse($input)->format($format2);
#endphp
It is simple just try it
$date="8/29/2011 1:00 PM"; // date that get from view (blade page)
$createTimestamp = new DateTime($date); // create timestamp object from string
$date = $createTimestamp->format('m/d/Y'); // get date
$time = $createTimestamp->format('H:i:s A'); // get time with AM/PM format
return "date: ".$date." time: ".$time; // return your result
Try this way
Use Carbon;
$dateAndTime=Carbon::parse('8/29/2011 1:00 PM');
$date=$dateAndTime->format('d-m-Y');// 29-8-2011
$time=$dateAndTime->format('H:i:s');// 1:00
$time=$dateAndTime->format('H:i:s A');// 1:00 AM/PM
Refer this link to understand more about Carbon.

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();
}

Display "time ago" instead of datetime in PHP Codeigniter

I would like to display a time format like twitter and FB (Posted 3 hours ago, Posted 2 minutes ago and so on...)
I've tried this piece of code without success :
function format_interval($timestamp, $granularity = 2) {
$units = array('1 year|#count years' => 31536000, '1 week|#count weeks' => 604800, '1 day|#count days' => 86400, '1 hour|#count hours' => 3600, '1 min|#count min' => 60, '1 sec|#count sec' => 1);
$output = '';
foreach ($units as $key => $value) {
$key = explode('|', $key);
if ($timestamp >= $value) {
$floor = floor($timestamp / $value);
$output .= ($output ? ' ' : '') . ($floor == 1 ? $key[0] : str_replace('#count', $floor, $key[1]));
$timestamp %= $value;
$granularity--;
}
if ($granularity == 0) {
break;
}
}
I use this function with a callback into another function like : $this->format_interval(); and pass it to my View
My current format date is : 2012-07-26 09:31:pm and already stored in my DB
Any help will be very appreciated!
The Date Helper's timespan() method just does that:
The most common purpose for this function is to show how much time has elapsed from some point in time in the past to now.
Given a timestamp, it will show how much time has elapsed in this format:
1 Year, 10 Months, 2 Weeks, 5 Days, 10 Hours, 16 Minutes
So, in your example, all you need to do is convert your date to a timestamp and do something like this:
$post_date = '13436714242';
$now = time();
// will echo "2 hours ago" (at the time of this post)
echo timespan($post_date, $now) . ' ago';
Try something like this in a my_date_helper.php file (source: Codeigniter Forums):
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
if( ! function_exists('relative_time'))
{
function relative_time($datetime)
{
$CI =& get_instance();
$CI->lang->load('date');
if(!is_numeric($datetime))
{
$val = explode(" ",$datetime);
$date = explode("-",$val[0]);
$time = explode(":",$val[1]);
$datetime = mktime($time[0],$time[1],$time[2],$date[1],$date[2],$date[0]);
}
$difference = time() - $datetime;
$periods = array("second", "minute", "hour", "day", "week", "month", "year", "decade");
$lengths = array("60","60","24","7","4.35","12","10");
if ($difference > 0)
{
$ending = $CI->lang->line('date_ago');
}
else
{
$difference = -$difference;
$ending = $CI->lang->line('date_to_go');
}
for($j = 0; $difference >= $lengths[$j]; $j++)
{
$difference /= $lengths[$j];
}
$difference = round($difference);
if($difference != 1)
{
$period = strtolower($CI->lang->line('date_'.$periods[$j].'s'));
} else {
$period = strtolower($CI->lang->line('date_'.$periods[$j]));
}
return "$difference $period $ending";
}
}
The format is a little different than the one you're using in your database (why do you mark times with pm/am rather than just use 24 hour times and convert for the frontend?). Either way, shouldn't take much work to get it working.
I had a function that solved this like this:
$int_diff = (time() - $int_time);
$str_this_year = date('Y-01-01', $int_time);
$str_weekday = t('time_weekday_'.strtolower(date('l', $int_time)));
$str_month = t('time_month_'.strtolower(date('F', $int_time)));
$arr_time_formats = array( '-90 seconds' => t('time_a_minute_at_most'),
'-45 minutes' => t('time_minutes_ago', ceil($int_diff / (60))),
'-70 minutes' => t('time_an_hour_at_most'),
'-8 hours' => t('time_hours_ago', ceil($int_diff / (60 * 60))),
'today' => t('time_hours_ago', ceil($int_diff / (60 * 60))),
'yesterday' => t('time_yesterday', date('H:i', $int_time)),
'-4 days' => t('time_week_ago', $str_weekday, date('H:i', $int_time)),
$str_this_year => t('time_date', date('j', $int_time), $str_month, date('H:i', $int_time)),
0 => t('time_date_year', date('j', $int_time), $str_month, date('Y', $int_time), date('H:i', $int_time)));
if ($boo_whole)
return $arr_time_formats[0];
foreach(array_keys($arr_time_formats) as $h)
if ($int_time >= strtotime($h))
return $arr_time_formats[$h];
Basicly t() is a function combined with $this->lang->line() and sprintf(). The idea here is to give keys that's runned through strtotime() till you reach the closest time, with 0 being the fallback.
This approach is really good since you can easy adjust the times with a nice overview. I could give more piece of the code, but it feels like doing too much of the work :) Basicly this is just the theory behind how you can do it.
<?php
$this->load->helper('date');
//client created date get from database
$date=$client_list->created_date;
// Declare timestamps
$last = new DateTime($date);
$now = new DateTime( date( 'Y-m-d h:i:s', time() )) ;
// Find difference
$interval = $last->diff($now);
// Store in variable to be used for calculation etc
$years = (int)$interval->format('%Y');
$months = (int)$interval->format('%m');
$days = (int)$interval->format('%d');
$hours = (int)$interval->format('%H');
$minutes = (int)$interval->format('%i');
// $now = date('Y-m-d H:i:s');
if($years > 0)
{
echo $years.' Years '.$months.' Months '.$days.' Days '. $hours.' Hours '.$minutes.' minutes ago.' ;
}
else if($months > 0)
{
echo $months.' Months '.$days.' Days '. $hours.' Hours '.$minutes.' minutes ago.' ;
}
else if($days > 0)
{
echo $days.' Days '.$hours.' Hours '.$minutes.' minutes ago.' ;
}
else if($hours > 0)
{
echo $hours.' Hours '.$minutes.' minutes ago.' ;
}
else
{
echo $minutes.' minutes ago.' ;
}
?>

Resources