Reputation: 51
I'm trying to get the day of a month with this code:
// your input
$month = "September";
$year = "2013";
$dayWeek = "Friday";
$week = 2;
// create a date object
$date = new DateTime();
// set to the first day of the specified year/month
$date->modify($year . '-' . $month . '-01');
// add $week -1 weeks to the date
$date->modify('+' . ($week - 1) . ' week');
// set to day of week
$date->modify($dayWeek);
// here's the day of month for you
echo $date->format('j');
BUT this code is not working, why not?
Because if I have this data:
$month = "December";
$year = "2019";
$dayWeek = "saturday";
$week = 2;
It should return 07 because if we look at the calendar in December 2019... the first week is just Sunday, BUT it returns 14 and I wonder why?? If 14 th of December is in the third week..
I'd like to know or to get a code which it gives me the day of a month... just giving $month, $year, dayWeek and week of the month.
Upvotes: 1
Views: 53
Reputation: 4654
Look here
When you specify dayname
the date, quote:
Moves to the next day of this name.
Therefore,
$date->modify($year . '-' . $month . '-01');
gives you 2019, December 1st, which is Sunday
$date->modify('+' . ($week - 1) . ' week');
adds 1 week, the date now Dec 8th, Sunday
And
$date->modify($dayWeek);
looks for the next saturday, which is Dec 14th, which is exactly second saturday in the month.
This may solve your issue.
<?php
// your input
$month = "December";
$year = "2019";
$dayWeek = "saturday";
$week = 2;
// create a date object
$date = new DateTime();
$date->modify($year . '-' . $month . '-01');
$date->modify('sunday'); // Put here 'saturday' if your week ends with saturday and starts with sunday
$end_of_the_first_week = $date->format('j');
// Start over again
$date->modify($year . '-' . $month . '-01');
$date->modify($dayWeek);
if ($date->format('j') > $end_of_the_first_week) { // we already in the second week
if ($week > 2) {
// add $week -2 weeks to the date
$date->modify('+' . ($week - 2) . ' week');
}
} else if ($week > 1) {
// add $week -1 weeks to the date
$date->modify('+' . ($week - 1) . ' week');
}
echo $date->format('j'); // 7
Upvotes: 2