Printing dates between two other dates on PHP [duplicate] - php

This question already has answers here:
PHP: Return all dates between two dates in an array [duplicate]
(26 answers)
Closed 6 years ago.
I'm trying to print dates between two other dates. Here is my code:
$begin = date("d/m/y");
$end = date("d/m/y", strtotime("+1 month"));
$i = 0;
while( strtotime($begin) <= strtotime($end) ){
echo "$begin\n";
$i++;
$begin = date("d/m/y", strtotime("+$i day") );
}
You can execute the same code here:
http://sandbox.onlinephpfunctions.com/code/34c4b721553038f585806798121941bee0c66086
For some reason this code is printing just the dates between 25/01/2017 and 31/01/2017 instead of 25/01/2017 and 25/02/2017. I don't know what's wrong. Can someone help me?

strtotime() doesn't support dates in d/m/y format. It treats these dates as m/d/y.
To fix your code, use Y-m-d format in the first two lines.
On a sidenote, I'd recommend to use \DateTime classes to manipulate dates instead of strings and integers. Read more here: https://paulund.co.uk/datetime-php

<?php
error_reporting(-1);
ini_set('display_errors', true);
$begin = new DateTime();
$end = (new DateTime())->modify('+1 month');
$interval = DateInterval::createFromDateString('1 day');
$period = new DatePeriod($begin, $interval, $end);
foreach ($period as $date) {
echo $date->format('d/m/y')."<br/>";
}

Related

How to hide saturday and sunday in PHP array [duplicate]

This question already has answers here:
Get date range between two dates excluding weekends
(4 answers)
Closed 2 years ago.
I want to hide Saturday and Sunday in PHP.
I´ve build the following code:
$begin = new DateTime($row['date']);
$end = new DateTime($row['dateul']);
$end = $end->modify( '+1 day' );
$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval ,$end);
foreach($daterange as $date){
$array[] = $date->format("Y-m-d");
}
Until here the code is working but it outputs the complete week/days in this daterange.
I found this code:
if (strcasecmp($daterange, 'Sun') != 0
&& strcasecmp($daterange, 'Sat') != 0){
}
Do I understand it right, that if value = 1 it will output Saturday for example?
Because the main idea was the following:
if day for example sunday = 0 hide it in array, if sunday=1 show it in array.
The values are coming from MySQL.
You can use the N format for DateTime::format to check the day of week, it returns 6 for Saturday and 7 for Sunday, so as long as the value is less than 6, add it to the array:
$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval ,$end);
$array = array();
foreach($daterange as $date){
if ($date->format('N') < 6) {
$array[] = $date->format("Y-m-d");
}
}
Demo on 3v4l.org
Update
Based on comments from the OP, days to be included have $row[<dayname>] = 1. In that case, you can use this foreach loop, using l format to get the full day of week name and strtolower to convert to lowercase to use as an index into $row:
foreach($daterange as $date){
if ($row[strtolower($date->format('l'))]) {
$array[] = $date->format("D Y-m-d");
}
}
Demo on 3v4l.org

PHP DatePeriod not showing all months [duplicate]

This question already has answers here:
PHP DateTime::modify adding and subtracting months
(19 answers)
Closed 3 years ago.
When executing the following code, PHP only shows month 10 and 12, ignoring month 11 at all.
$sollStart = '2019-10-31 00:00:01';
$sollEnde = '2019-12-31 23:59:59';
$start = new DateTime($sollStart);
$end = new DateTime($sollEnde);
$periodInterval = new \DateInterval('P1M');
$periodIterator = new \DatePeriod($start, $periodInterval, $end);
foreach ($periodIterator as $monat) {
echo $monat->format('m');
}
If I change the start date to 2019-10-30 it is working like expected.
I've no idea what to change to make it work.
Try this:
$sollstart = (new DateTime('2019-10-31 00:00:01'))->modify('first day of this month');
$sollend = (new DateTime('2019-12-31 23:59:59'))->modify('first day of this month');
$interval = DateInterval::createFromDateString('1 month');
$period = new DatePeriod($sollstart, $interval, $sollend);
foreach ($period as $m) {
echo $m->format("m") . "<br>";
}

PHP - Fetch all dates between two dynamic UNIX timestamps [duplicate]

This question already has answers here:
PHP: Return all dates between two dates in an array [duplicate]
(26 answers)
Closed 4 years ago.
I want to get all the dates between two given specific dates which will be changing dynamically according to the user requirements.
This works fine for me :
$begin = new DateTime( '2018-07-01' );
$end = new DateTime( '2018-08-10' );
$end = $end->modify( '+1 day' );
$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval ,$end);
$dates = [];
foreach($daterange as $date){
array_push($dates,$date->format('Y-m-d'));
}
return $dates;
But this gives me NULL array when I insert dates dynamically. For example,
$begin = new DateTime($request->date1);
$end = new DateTime(today());
$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval ,$end);
$dates = [];
foreach($daterange as $date){
array_push($dates,$date->format('Y-m-d'));
}
return dates;
I have tried many inputs like storing today's date in a variable, changing it's format and then using that variable as an input. I tried changing date variable to string using (string) function and also I have used Carbon classes for dates, but somehow I am making mistake using DateTime, DateInterval and DatePeriod as I don't know the basics of them.
I need to get all the dates between two specific dates for charts in my admin panel.
Finally got the solution for this question. It worked by converting the dates to UNIX timestamp. Here's the code, how it worked:
$date_from = "2018-07-01";
$date_from = strtotime($date_from); // Convert date to a UNIX timestamp
// Specify the end date. This date can be any English textual format
$date_to = strtotime(today()); // Convert date to a UNIX timestamp
$dates = [];
// Loop from the start date to end date and output all dates inbetween
for ($i=$date_from; $i<=$date_to; $i+=86400) {
array_push($dates,date("Y-m-d", $i));
}
return $dates;
Here is the reference where I found this solution, hope this helps others too.

How to check if there is Feb 29 in between two dates using php [duplicate]

This question already has answers here:
Checking if there's a leap day in a timerange
(2 answers)
Closed 7 years ago.
How to check if there is Feb 29 in between two dates using php
$fromDate = strtotime($contract->from);
$toDate = strtotime($contract->to);
DateTime, DateInterval and DatePeriod is a good way to work with dates in PHP:
$begin = new DateTime( '2015-12-20' );
$end = new DateTime( '2016-03-10' );
$interval = DateInterval::createFromDateString('1 day');
$period = new DatePeriod($begin, $interval, $end);
foreach ( $period as $dt ) {
if(($dt->format('m') === '02') && ($dt->format('d') === '29')) {
echo 'got date February 29th!';
}
}
This script will take first date, last date and loop over the interval day by day to check for the desired date.

get all weekdays in php [duplicate]

This question already has an answer here:
PHP: getting weekdays numbers of a given month
(1 answer)
Closed 10 years ago.
I am thingking if how to get all the date of weekdays between a given date
example: I have a date given 2013-01-01 and 2013-20-01
It must return all date of weekdays like 2013-01-01
how could this be done using php
thankz
Look into DatePeriod Class, this is available from PHP 5.3.
Here is an example from the site
$begin = new DateTime( '2012-08-01' );
$end = new DateTime( '2012-08-31' );
$end = $end->modify( '+1 day' );
$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval ,$end);
foreach($daterange as $date){
// You can manipulate the date here
echo $date->format("Ymd") . "<br>";
}
You can get the weekday from the timestamp using the multitude of formatting options avalaible:
echo date("D",strtotime("2013-01-01"));
tues

Categories