Я хочу создать PHP-скрипт для определения списка всего понедельника месяца.
На декабрь - 2014 (1-12-2014, 8-12-2014, 15-12-2014, 22-12-2014, 29-12-2014) и
За январь - 2015 (29-12-2014, 5-1-2015, 12-1-2015, 19-1-2015, 26-1-2015)
За февраль - 2015 (2-2-2015,9-2-2015,16-2-2015,23-2-2015)
За ноябрь - 2014 (27-10-2014, 3-11-2014,10-11-2014,17-11-2014,24-11-2014,)
В сценарии, если первый день месяца посередине недели, чем в последний месяц в понедельник.
В этот скрипт начинается неделя с понедельника по воскресенье.
Ans:
<?php
$selectedmonth="January 2015";
$dat=strtotime("first day of ".$selectedmonth);
if(date('N',$dat)>1) {
$previousmonth=date('F Y',strtotime($selectedmonth."-1 month"));
$firstMonday=strtotime("last monday of ".$previousmonth);
}
else
{
$firstMonday=strtotime("first monday of ".$selectedmonth);
}
$temp=$firstMonday;
$s="(".date("Y-m-d",$firstMonday).",";
$lastmonday=strtotime("last monday of ".$selectedmonth);
while($temp!=$lastmonday)
{
$temp=strtotime(date("d F Y",$temp)."+1 week");
$s.=date("Y-m-d",$temp).",";
}
$s=trim($s,",").")";
echo $s;
?>
Спасибо вам всем.
Вы можете создать функцию, которая создаст объект \DateTime
в первый понедельник месяца. Затем в цикле while повторяется в течение дней (с шагом в 7 дней) и \DateTime
объект \DateTime
до достижения следующего месяца.
С помощью этой функции вы также можете указать день, когда хотите собрать массив.
/**
* Get an array of \DateTime objects for each day (specified) in a year and month
*
* @param integer $year
* @param integer $month
* @param string $day
* @param integer $daysError Number of days into month that requires inclusion of previous Monday
* @return array|\DateTime[]
* @throws Exception If $year, $month and $day don't make a valid strtotime
*/
function getAllDaysInAMonth($year, $month, $day = 'Monday', $daysError = 3) {
$dateString = 'first '.$day.' of '.$year.'-'.$month;
if (!strtotime($dateString)) {
throw new \Exception('"'.$dateString.'" is not a valid strtotime');
}
$startDay = new \DateTime($dateString);
if ($startDay->format('j') > $daysError) {
$startDay->modify('- 7 days');
}
$days = array();
while ($startDay->format('Y-m') <= $year.'-'.str_pad($month, 2, 0, STR_PAD_LEFT)) {
$days[] = clone($startDay);
$startDay->modify('+ 7 days');
}
return $days;
}
Тогда, когда вы бежите..
$days = getAllDaysInAMonth(2015, 01);
foreach ($days as $day) {
echo $day->format('D Y-m-d').'<br />';
}
Вы закончите с..
Mon 2014-12-29
Mon 2015-01-05
Mon 2015-01-12
Mon 2015-01-19
Mon 2015-01-26
ПРИМЕЧАНИЕ. $daysError
добавлен таким образом, чтобы соответствовать предостережению о том, что в предыдущие месяцы последний указанный день, если начало месяца прошло "в середине недели".
Функция "Ниже" даст вам понедельника через месяц
function getMondays($year, $month)
{
$mondays = array();
# First weekday in specified month: 1 = monday, 7 = sunday
$firstDay = date('N', mktime(0, 0, 0, $month, 1, $year));
/* Add 0 days if monday ... 6 days if tuesday, 1 day if sunday
to get the first monday in month */
$addDays = (8 - $firstDay) % 7;
$mondays[] = date('r', mktime(0, 0, 0, $month, 1 + $addDays, $year));
$nextMonth = mktime(0, 0, 0, $month + 1, 1, $year);
# Just add 7 days per iteration to get the date of the subsequent week
for ($week = 1, $time = mktime(0, 0, 0, $month, 1 + $addDays + $week * 7, $year);
$time < $nextMonth;
++$week, $time = mktime(0, 0, 0, $month, 1 + $addDays + $week * 7, $year))
{
$mondays[] = date('r', $time);
}
return $mondays;
}