pc-buddy
asked on
Total days in a month
Hi,
I need to count the number of times a certain day exists in a month, so how many mondays in this month etc
Tried this but didnt count correctly, kept saying there were 5 tuesday this monday when there are only 4.
Thanks Simon
I need to count the number of times a certain day exists in a month, so how many mondays in this month etc
Tried this but didnt count correctly, kept saying there were 5 tuesday this monday when there are only 4.
<?php $now=date('m');
if (($dow = date('w', $now)) == $row['day_of_the_week']) $dow = 7;
$begin = $now - (86400 * ($dow));
echo "x ".ceil(date('d', $begin) / 7); ?>
Thanks Simon
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
ignore me, i changed the dat to this month :)
Thanks
Thanks
You good then?
ASKER
Nearly, what parts do I change to make it show tuesdays ? :)
Thanks
Thanks
So $Monday is a variable. your option to change or not. or make it agnostic (ie. $day)
In line 3 you'll see
That...you change to 'Tuesday'
In line 3 you'll see
=== 'Monday'
That...you change to 'Tuesday'
ASKER
Thank for all your help :)
A code sample is available in this article. Please see Practical Application #5:
https://www.experts-exchange.com/articles/201/Handling-Date-and-Time-in-PHP-and-MySQL-Procedural-Version.html
https://www.experts-exchange.com/articles/201/Handling-Date-and-Time-in-PHP-and-MySQL-Procedural-Version.html
ASKER
Propbaly the dumbest question I've ever ask :)
TUESDAY
Thanks
TUESDAY
Thanks
Here's a generalized solution that works over leap year and daylight savings time.
https://iconoun.com/demo/find_weekdays.php
https://iconoun.com/demo/find_weekdays.php
<?php // demo/find_weekdays.php
/**
* https://www.experts-exchange.com/questions/28976308/Total-days-in-a-month.html
*
* https://www.experts-exchange.com/articles/201/Handling-Date-and-Time-in-PHP-and-MySQL-Procedural-Version.html
* https://www.experts-exchange.com/articles/20920/Handling-Time-and-Date-in-PHP-and-MySQL-OOP-Version.html
*/
error_reporting(E_ALL);
function find_weekdays($date='Today', $day='Sunday')
{
$timestamp = strtotime(date('Y-m-0', strtotime($date)));
$weekdays[0] = date('Y-m-d D', strtotime("first $day", $timestamp));
$weekdays[1] = date('Y-m-d D', strtotime("second $day", $timestamp));
$weekdays[2] = date('Y-m-d D', strtotime("third $day", $timestamp));
$weekdays[3] = date('Y-m-d D', strtotime("fourth $day", $timestamp));
$weekdays[4] = date('Y-m-d D', strtotime("fifth $day", $timestamp));
if (substr($weekdays[4],5,2) != date('m', strtotime("first $day", $timestamp))) unset($weekdays[4]);
return $weekdays;
}
// USE THE FUNCTION
$mon = 'February 2008';
$day = 'Friday';
$res = find_weekdays($mon, $day);
echo PHP_EOL . "IN $mon, $day OCCURS " . count($res) . " TIMES";
echo PHP_EOL;
print_r($res);
I know this has been answered already, but I'd recommend you reconsider using the code you've selected, as it's VERY heavy for such a simple problem.
Both date and strtotime functions are called a whopping 61 times EACH in the accepted code.
Take the following function, which runs a whopping 1600% FASTER than the original code, simply by using some basic math:
Note that I've left in some commented echo statements so that you can follow along with what the code is doing if you want to try it out a few times.
To be clear, the speed differences we're talking about are milliseconds vs. microseconds. The original function you accepted takes nearly 6 milliseconds to run. That's a pretty long time for such a simple problem, and if you run it more than once, it can really add up quickly.
Choosing not to care about milliseconds or efficiency in smaller functions like these is how companies end up with larger applications that run slow - because there are lots of small inefficiencies that never get fixed and then it's too late to go back and fix them later (you'll never get someone to later agree to spending money and time to speed the application up by 6 milliseconds), so being efficient at the beginning is important for the long run.
Both date and strtotime functions are called a whopping 61 times EACH in the accepted code.
Take the following function, which runs a whopping 1600% FASTER than the original code, simply by using some basic math:
// Day numbers: 0 = Sunday, 1 = Monday, ...., 6 = Saturday
function number_days_in_month($day_number = 0, $month = "2016-10-01")
{
$ts = strtotime($month);
$days_in_month = date("t",$ts);
// echo "There are {$days_in_month} total days in {$month}.\n";
$starting_day = date("w",$ts); // 0 = Sunday, 6 = Saturday
// echo "The day of the week for {$month} is {$starting_day}.\n";
$first_day_offset = $day_number - $starting_day;
// echo "The first day offset is {$first_day_offset}\n";
$days_left_in_month = $days_in_month - ($first_day_offset < 0 ? 7 + $first_day_offset : $first_day_offset);
// echo "After taking the offset into consideration, there are {$days_left_in_month} days left in the month.\n";
return ceil($days_left_in_month/7);
}
Note that I've left in some commented echo statements so that you can follow along with what the code is doing if you want to try it out a few times.
To be clear, the speed differences we're talking about are milliseconds vs. microseconds. The original function you accepted takes nearly 6 milliseconds to run. That's a pretty long time for such a simple problem, and if you run it more than once, it can really add up quickly.
Choosing not to care about milliseconds or efficiency in smaller functions like these is how companies end up with larger applications that run slow - because there are lots of small inefficiencies that never get fixed and then it's too late to go back and fix them later (you'll never get someone to later agree to spending money and time to speed the application up by 6 milliseconds), so being efficient at the beginning is important for the long run.
Alternative for interest
function daysInMonth($date, $dow)
{
$daysinmonth = date('t', $date);
$firstdayofmonth = date('w', $date);
$fivedays = $daysinmonth - 28;
$dow += $dow < $firstdayofmonth ? 7 : 0;
return $dow >= $firstdayofmonth && $dow < $firstdayofmonth + $fivedays ? 5 : 4;
}
$date = strtotime('2016-02-01');
$days = daysInMonth($date, SUNDAY);
echo "#days = {$days}<br/>";
$days = daysInMonth($date, MONDAY);
echo "#days = {$days}<br/>";
$days = daysInMonth($date, TUESDAY);
echo "#days = {$days}<br/>";
ASKER
Thanks