getting next 6 days from current day? - php

I try to store next 6 days from current day ,but I'm little stuck here how to store all next 6days in $weekOfdays .Is there any simple function to do that?
<?php
$weekOfdays = array();
$day = date('l');
$weekOfdays[] = $day;
$day = strtotime($day);
$next = strtotime("+6 day",$day);
$weekOfdays[] = date("l",$next);
var_dump($weekOfdays);
// output
// array (size=2)
// 0 => string 'Monday' (length=6)
// 1 => string 'Sunday' (length=6)
?>
I want to see array is like this
array (size=7)
0 => string 'Monday' (length=6)
1 => string 'Tuesday' (length=7)
2 => string 'Wednesday' (length=9)
3 => string 'Thursday' (length=8)
4 => string 'Friday' (length=6)
5 => string 'Saturday' (length=8)
6 => string 'Sunday' (length=6)

Here's one that doesn't directly rely on doing the math on your own:
$days = [];
$period = new DatePeriod(
new DateTime(), // Start date of the period
new DateInterval('P1D'), // Define the intervals as Periods of 1 Day
6 // Apply the interval 6 times on top of the starting date
);
foreach ($period as $day)
{
$days[] = $day->format('l');
}

There are many way some of sample are mentioned as below:
1) using strtotime function and temp $date variable in loop
$date = date('Y-m-d'); //today date
$weekOfdays = array();
for($i =1; $i <= 7; $i++){
$date = date('Y-m-d', strtotime('+1 day', strtotime($date)));
$weekOfdays[] = date('l : Y-m-d', strtotime($date));
}
print_r($weekOfdays);
2) using strtotime function and +$i days from current date
$date = date('Y-m-d'); //today date
$weekOfdays = array();
for($i =1; $i <= 7; $i++){
$weekOfdays[] = date('l : Y-m-d', strtotime("+$i day", strtotime($date)));
}
print_r($weekOfdays);
3) using DateTime class and modify method
$date = date('Y-m-d'); //today date
$weekOfdays = array();
$date = new DateTime($date);
for($i=1; $i <= 7; $i++){
$date->modify('+1 day');
$weekOfdays[] = $date->format('l : Y-m-d');
}
print_r($weekOfdays);
4) using DateTime class and DateInterval class
$date = date('Y-m-d'); //today date
$weekOfdays = array();
$date = new DateTime($date);
for($i=1; $i <= 7; $i++){
$date->add(new DateInterval('P1D'));
$weekOfdays[] = $date->format('l : Y-m-d');
}
print_r($weekOfdays);
5) using DatePeriod, DateInterval and DateTime class
$date = date('Y-m-d', strtotime('+1 day')); //tomorrow date
$weekOfdays = array();
$begin = new DateTime($date);
$end = new DateTime($date);
$end = $end->add(new DateInterval('P7D'));
$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval ,$end);
foreach($daterange as $dt){
$weekOfdays[] = $dt->format('l : Y-m-d');
}
print_r($weekOfdays);
Today is Tuesday, 12 April so output of all code will be:
Array
(
[0] => Wednesday : 2016-04-13
[1] => Thursday : 2016-04-14
[2] => Friday : 2016-04-15
[3] => Saturday : 2016-04-16
[4] => Sunday : 2016-04-17
[5] => Monday : 2016-04-18
[6] => Tuesday : 2016-04-19
)
For more detail have a look at:
strtotime
DateTime
DateInterval
DatePeriod

I believe you need a for loop:
$weekOfdays = array();
$day = date('l');
$weekOfdays[] = $day;
$day = strtotime($day);
for($i = 1; $i <= 6; ++$i) {
$next = strtotime("+$i day",$day);
$weekOfdays[] = date("l",$next);
}

Just use a while loop to adjust day by day. Just add another day +1:
$weekOfdays = array();
$date = time();
$next = strtotime('+6 days');
while ($date <= $next) { // loop until next six
$weekOfdays[] = date('l', $date); // push the day name
$date = strtotime('+1 day', $date); // add +1 on $date
}
print_r($weekOfdays);

Using strtotime function and while-loop
$weekOfdays = array();
$current_date = time(); //get current date.
$next = strtotime('+6 days');
while ($current_date <= $next) {
$weekOfdays[] = date('l', $current_date);
$current_date = strtotime('+1 day', $current_date); // add next date
}
echo "<pre>";
print_r($weekOfdays);
echo "</pre>";
Result :
Array
(
[0] => Friday
[1] => Saturday
[2] => Sunday
[3] => Monday
[4] => Tuesday
[5] => Wednesday
[6] => Thursday
)

here is simple modification in you code which will display total days
<?php
$weekOfdays = array();
$day = date('l');
$weekOfdays[] = $day;
$day = strtotime($day);
$total_days='5';//you can increase or decrease the day to display
for($i=1;$i<=$total_days;$i++){
$next = strtotime("+$i day",$day);
$weekOfdays[] = date("l",$next);
}
print_r($weekOfdays);
?>
And its out put
Array (
[0] => Monday
[1] => Tuesday
[2] => Wednesday
[3] => Thursday
[4] => Friday
[5] => Saturday )

$weekOfdays = array();
$date = date("l");// current day
for($i = 0; $i < 7; $i++) {
$weekOfdays[] = date("l", strtotime($date . "+$i day"));
}
var_dump($weekOfdays);

Check the following.Here array gets 7 day name including the current day.
$weekOfdays = array();
for($i = 1,$nxtday = time(); $i<=7; $i++)
{
$weekOfdays[] = date("l", $nxtday);
$nxtday += 86400;
}
var_dump($weekOfdays);

<?php
$weekOfdays = array();
$currentDay = time();
for ($i = 0; $i < 7; $i++) {
$weekOfdays[] = date('l', $currentDay);
$currentDay = strtotime('+1 day', $currentDay);
}
var_dump($weekOfdays);
will output (today's friday)
array (size=7)
0 => string 'Friday' (length=6)
1 => string 'Saturday' (length=8)
2 => string 'Sunday' (length=6)
3 => string 'Monday' (length=6)
4 => string 'Tuesday' (length=7)
5 => string 'Wednesday' (length=9)
6 => string 'Thursday' (length=8)

<?php
$weekOfDays = array();
$now = time();
$daysCnt = 6;
while ($daysCnt > 0) {
$now = mktime(0,0,0,date('m',$now),date('d',$now)+1,date('Y',$now));
$weekOfDays[] = date('l', $now);
$daysCnt--;
}
print_r($weekOfDays);
output:
Array
(
[0] => Saturday
[1] => Sunday
[2] => Monday
[3] => Tuesday
[4] => Wednesday
[5] => Thursday
)
the purpose of usage mktime() instead of strtotime() is a feature:
<?php
date_default_timezone_set("Europe/Moscow");
$today = date("d-m-Y",mktime(0,0,0,4,28,2013)); // 28-04-2013, sunday
$lastWeek = strtotime("last week $today");
$thisWeek = strtotime("this week $today");
$nextWeek = strtotime("next week $today");
echo "last week - ".$lastWeek." / ".date("d-m-Y H:i\n",$lastWeek);
echo "this week - ".$thisWeek." / ".date("d-m-Y H:i\n",$thisWeek);
echo "next week - ".$nextWeek." / ".date("d-m-Y H:i\n",$nextWeek);
result:
last week - 1366574400 / 22-04-2013 00:00; expected 15-04-2013
this week - 1367179200 / 29-04-2013 00:00; expected 22-04-2013
next week - 1367784000 / 06-05-2013 00:00; expected 29-04-2013
I recommend double-check expected results when you use strtotime()

Related

how to get week of month?

I want an array of containing weeks of current month, How can i get this? I have tried different methods but none of them is working for me..
$month = date('m'); // it should be CURRENT MONTH Of Current Year
$year = date('y'); // Current year
$beg = (int) date('W', strtotime("$year-$month"));
$end = (int) date('W', strtotime("$year-$month"));
I have used the above code but not working..
I want to put those week numbers of current month into an array like
array ('1' => 'first week of march', '2' => '2nd week of march', '3' => '3rd week of march', '4' => '4th week of march', '5' => '5th week of march' ) etc
1,2,3,4,5 in array can be week number
For getting beginning and ending ISO week number use below code:
$beg = (int) date('W', strtotime(date("Y-m-01")));
$end = (int) date('W', strtotime(date("Y-m-t")));
function weeksOfMonth($month, $year){
$num_of_days = date("t", mktime(0,0,0,$month,1,$year));
$lastday = date("t", mktime(0, 0, 0, $month, 1, $year));
$no_of_weeks = 0;
$count_weeks = 0;
while($no_of_weeks < $lastday){
$no_of_weeks += 7;
$count_weeks++;
}
return $count_weeks;
}
echo weeksOfMonth(3, 2017);
After some hard time looking for it, Here is the Answer, Sorry for posting a bit late here. I hope it will help you guys.
public static function getWeeksOfMonth()
{
$currentYear = date('Y');
$currentMonth = date('m');
//Substitue year and month
$time = strtotime("$currentYear-$currentMonth-01");
//Got the first week number
$firstWeek = date("W", $time);
if ($currentMonth == 12)
$currentYear++;
else
$currentMonth++;
$time = strtotime("$currentYear-$currentMonth-01") - 86400;
$lastWeek = date("W", $time);
$weekArr = array();
$j = 1;
for ($i = $firstWeek; $i <= $lastWeek; $i++) {
$weekArr[$i] = 'week ' . $j;
$j++;
}
return $weekArr;
}
The Result will be the weeks of current Month..
Array (
[26] => week 1
[27] => week 2
[28] => week 3
[29] => week 4
[30] => week 5
[31] => week 6
)

how can i store week days names in an array from given date range?

I want to store names of the week days in an array from given date range.
Eg. If given date range is from 2016-12-1 to 2017-02-22 then i want to store all weekdays comes in this date range.
$timestamp = strtotime('next Sunday');
$days = array();
for ($i = 0; $i < 7; $i++) {
$days[] = strftime('%A', $timestamp);
$timestamp = strtotime('+1 day', $timestamp);
}
Try this. Provide Start date,end date, weekdays as input params
function progDateRange($date, $end_date, array $wkDays, array $excluded)
{
$dates = array();
$current_date = strtotime($date);
$max_date = min(strtotime('+2 years'), strtotime($end_date));
$dow = array_keys($wkDays);
while ($current_date < $max_date) {
if ($excluded && in_array($date_formatted, $excluded, true)) {
continue;
}
if (in_array(date('l'), $dow, true)) {
array_push($dates, $date);
}
$current_date = strtotime('+1 day', $current_date);
$date = date('Y-m-d', $current_date);
}
return $dates;
}
The solution using date and strtotime functions:
$date_from = '2016-12-1';
$date_to = '2017-02-22';
$current = strtotime($date_from);
$max_time = strtotime($date_to);
$weekdays = [];
while ($current <= $max_time) {
// getting weekday name for current timestamp within date range
$weekdays[] = date('l', $current);
$current = strtotime('+1 day', $current); // setting timestamp for each next next day in increase order
}
print_r($weekdays);
The output will be like below:
Array
(
[0] => Thursday
[1] => Friday
[2] => Saturday
[3] => Sunday
[4] => Monday
[5] => Tuesday
[6] => Wednesday
[7] => Thursday
[8] => Friday
[9] => Saturday
[10] => Sunday
[11] => Monday
[12] => Tuesday
[13] => Wednesday
[14] => Thursday
....
...

geting specific dates in the future with php

so my problem is rather simple but the solution keeps evading me. i am trying to get a list of future dates at a set interval that respects week nr in month and day nr in week. for example i need to make a list of dates of the 2nd mondays at 3 months apart.
i have a form where user specifies 2 dates and the interval.
so what i have is something like:
$start_date = "2015-01-07";
$end_date = "2016-01-07";
$period = "+1 month";
then, using this function from this link stackoverflow i get what weeknr my start_date is: (ie: "first monday")
function literalDate($timestamp) {
$timestamp = is_numeric($timestamp) ? $timestamp : strtotime($timestamp);
$weekday = date('l', $timestamp);
$month = date('M', $timestamp);
$ord = 1;
while(date('M', ($timestamp = strtotime('-1 week', $timestamp))) == $month) {
$ord++;
}
$lit = array(null, 'first', 'second', 'third', 'fourth', 'fifth');
return $lit[$ord].' '.$weekday;
}
$day_number = literalDate($start_date);
$list=array();
then. i'm trying to do this
while(strtotime($start_date) <= strtotime($end_date))
{
$list[]=$start_date;
$start_date=date('Y-m-d', strtotime("$start_date $period"));
$month = date('F', strtotime($start_date));
$start_date = date('Y-m-d', strtotime($day_number.' of '.$month)); //this always returns 1970-01-01
}
print_r($list);
as asked in comment my expected output is something like
array(
[0] => 2015-01-07
[1] => 2015-02-04
[2] => 2015-03-04
[3] => 2015-04-01
[4] => 2015-05-06
[5] => 2015-06-03
[6] => 2015-07-01
[7] => 2015-08-05
[8] => 2015-09-02
[9] => 2015-10-07
[10] => 2015-11-04
[11] => 2015-12-02
)
From what I understand, DateInterval should get you what you need:
$start = new DateTime('2015-01-07');
$start->modify('first day of this month');
$end = new DateTime('2016-01-07');
$end->modify('first day of this month');
$interval = DateInterval::createFromDateString('first wednesday');
$period = new DatePeriod($start, $interval, $end);
foreach ($period as $dt) {
$d = $dt->format("d");
if($d <= 7){
echo $dt->format("Y-m-d") . "\n";
}
}
will display:
2015-01-07
2015-02-04
2015-03-04
2015-04-01
2015-05-06
2015-06-03
2015-07-01
2015-08-05
2015-09-02
2015-10-07
2015-11-04
2015-12-02
2016-01-06
strtotime() which works in reference of today.
strtotime("+x days");
strtotime
if you need something in relation to another date...
date("Y-m-d", strtotime($yourdate) + 86400 * $days);

find specific weeks in month using php

I am tring to get the week from the month having starting Monday and end with Sunday with in same month.
i'll provide month and year.
for example:
$month = '03';
$year = '2014';
then function should return
2014-03-03 to 2014-03-09 as start date of month coz the month has its first Monday on 3rd.
then continue to month till last week.
In march, 2014, 31st starts on Monday but don't finish in march, it finishes at 06-04-2014 so this should not be included in counting.
Now, when i pass month as '04' than the month should count 31st march in its first week.
I hope i make my self clear, sorry for language.
I have tried so far:
$month = "04";
$year = "2014";
$beg = (int)date('W', strtotime("first day of $year-$month"));
$end = (int)date('W', strtotime("last day of $year-$month"));
$weeks = range($beg, $end);
foreach($weeks as $week) {
$result = $this->getStartAndEndDate($week, $year);
print_r($result);
}
function getStartAndEndDate($week, $year)
{
$time = strtotime("1 January $year", time());
$day = date('w', $time);
$time += ((7*$week)+1-$day)*24*3600;
$return[0] = date('Y-m-d', $time);
$time += 6*24*3600;
$return[1] = date('Y-m-d', $time);
return $return;
}
OUTPUT:
Array
(
[0] => 2014-03-03
[1] => 2014-03-09
)
Array
(
[0] => 2014-03-10
[1] => 2014-03-16
)
Array
(
[0] => 2014-03-17
[1] => 2014-03-23
)
Array
(
[0] => 2014-03-24
[1] => 2014-03-30
)
Array
(
[0] => 2014-03-31
[1] => 2014-04-06
)
Array
(
[0] => 2014-04-07
[1] => 2014-04-13
)
You can use the DateTime class for this:
$dt = new DateTime('1st march');
// is this a monday?
if($dt->format('N') !== '1') {
// if not, went to next monday
$dt->modify('next monday');
}
echo $dt->format('Y-m-d')
. ' to ' . $dt->modify('next sunday')->format('Y-m-d');
Output:
2014-03-03 to 2014-03-09
<?php
function get_weeks($month, $year) {
$weeks = array();
$date = DateTime::createFromFormat('mY', $month.$year);
$date->modify('first Monday of this month');
$end = clone $date;
$end->modify('last Monday of this month');
$interval = DateInterval::createFromDateString('1 week');
$period = new DatePeriod($date, $interval, $end);
$counter = 1;
foreach ($period as $dt) {
$end_of_week = clone $dt;
$end_of_week->modify('next Sunday');
$weeks[] = sprintf("Week %u: %s - %s",
$counter,
$dt->format('Y-m-d'),
$end_of_week->format('Y-m-d')
);
$counter++;
}
return $weeks;
}
$weeks = get_weeks('03', '2014');
print_r($weeks);
Array
(
[0] => Week 1: 2014-03-03 - 2014-03-09
[1] => Week 2: 2014-03-10 - 2014-03-16
[2] => Week 3: 2014-03-17 - 2014-03-23
[3] => Week 4: 2014-03-24 - 2014-03-30
)
See it in action

How to find the dates between two specified date?

If I have two dates 20-4-2010 and 22-4-2010
in two text box and
I want the dates to be like this 20, 21, 22. How do I get that ?
I am pretty sure this has been answered a quadrillion times before, but anyway:
$start = strtotime('20-04-2010 10:00');
$end = strtotime('22-04-2010 10:00');
for($current = $start; $current <= $end; $current += 86400) {
echo date('d-m-Y', $current);
}
The 10:00 part is to prevent the code to skip or repeat a day due to daylight saving time.
By giving the number of days:
for($i = 0; $i <= 2; $i++) {
echo date('d-m-Y', strtotime("20-04-2010 +$i days"));
}
With PHP5.3
$period = new DatePeriod(
new DateTime('20-04-2010'),
DateInterval::createFromDateString('+1 day'),
new DateTime('23-04-2010') // or pass in just the no of days: 2
);
foreach ( $period as $dt ) {
echo $dt->format( 'd-m-Y' );
}
You can use mktime().
mktime() is useful for doing date arithmetic and validation, as it will automatically calculate the correct value for out-of-range input.
If you increment the day number you get a valid date back, even if you go past the end of the month:
<?php
$day= 25;
$dateEnd = mktime(0,0,0,5,3,2010);
do {
$dateCur = mktime(0,0,0,4,$day,2010);
$day++;
print date( 'd-m-y', $dateCur) .'<br>';
} while ($dateCur < $dateEnd);
Output:
25-04-10
26-04-10
27-04-10
28-04-10
29-04-10
30-04-10
01-05-10
02-05-10
03-05-10
You can do:
$start = strtotime("2010-04-20"); // get timestamp for start date.
$end = strtotime("2010-04-22"); // get timestamp for end date.
// go from start timestamp to end timestamp adding # of sec in a day.
for($t=$start;$t<=$end;$t+=86400) {
// get the date for this timestamp.
$d = getdate($t);
// print the date.
echo $d['mday'].'-'.$d['mon'].'-'.$d['year']."\n";
}
Output:
20-4-2010
21-4-2010
22-4-2010
/**
* Function to list of weeks start and end.
* #param string strDateFrom (Date From "YYYY-MM-DD")
* #param string strDateTo (Date To "YYYY-MM-DD")
* #return array weeks
*/
function getWeeksBetweenTowDates($date_from, $date_to) {
$startweek = $current_week = date("W", strtotime($date_from));
$endweek = date("W", strtotime($date_to));
$current_year = date("Y", strtotime($date_from));
$current_yearweek = date("Y", strtotime($date_from)) . $startweek;
$end_yearweek = date("Y", strtotime($date_to)) . $endweek;
$start_day = 0;
$end_day = 0;
while ($current_yearweek <= $end_yearweek) {
$dto = new DateTime();
if ($start_day == 0) {
$start_day = $dto->setISODate(date("Y", strtotime($date_from)), $current_week, 0)->format('Y-m-d');
$end_day = $dto->setISODate(date("Y", strtotime($date_from)), $current_week, 6)->format('Y-m-d');
} else {
$start_day = $dto->setISODate(date("Y", strtotime($end_day)), $current_week, 0)->format('Y-m-d');
$end_day = $dto->setISODate(date("Y", strtotime($end_day)), $current_week, 6)->format('Y-m-d');
}
$arr_weeks[sprintf("%02d", $current_week)] = $start_day . " =>" . $end_day;
$last_yearweek_in_year = $current_year . date("W", strtotime('31-12-' . $current_year));
if ($current_yearweek == $last_yearweek_in_year) { //last week in the year
$current_week = 1;
$current_year = ($current_year + 1);
} else {
$current_week = ($current_week + 1);
}
$current_yearweek = $current_year . sprintf("%02d", $current_week);
}
return $arr_weeks;
}
Run Like : date_from=2015-10-20 , date_to=2016-04-15
$arr_weeks = $this->getWeeksBetweenTowDates($date_from, $date_to);
Output:
Array
(
[43] => 2015-10-18 =>2015-10-24
[44] => 2015-10-25 =>2015-10-31
[45] => 2015-11-01 =>2015-11-07
[46] => 2015-11-08 =>2015-11-14
[47] => 2015-11-15 =>2015-11-21
[48] => 2015-11-22 =>2015-11-28
[49] => 2015-11-29 =>2015-12-05
[50] => 2015-12-06 =>2015-12-12
[51] => 2015-12-13 =>2015-12-19
[52] => 2015-12-20 =>2015-12-26
[53] => 2015-12-27 =>2016-01-02
[01] => 2016-01-03 =>2016-01-09
[02] => 2016-01-10 =>2016-01-16
[03] => 2016-01-17 =>2016-01-23
[04] => 2016-01-24 =>2016-01-30
[05] => 2016-01-31 =>2016-02-06
[06] => 2016-02-07 =>2016-02-13
[07] => 2016-02-14 =>2016-02-20
[08] => 2016-02-21 =>2016-02-27
[09] => 2016-02-28 =>2016-03-05
[10] => 2016-03-06 =>2016-03-12
[11] => 2016-03-13 =>2016-03-19
[12] => 2016-03-20 =>2016-03-26
[13] => 2016-03-27 =>2016-04-02
[14] => 2016-04-03 =>2016-04-09
[15] => 2016-04-10 =>2016-04-16
)
Try this, Hope it help helps
$begin = date("Y-m-d", strtotime($date);
$end = date("Y-m-d", strtotime($date));
$begin = new DateTime($begin);
$end = new DateTime($end);
for ($i = $begin; $i <= $end; $i=$i->modify('+1 day')) {
echo $i->format('Y-m-d');
}

Categories