каждый понедельник месяца в PHP [дубликаты]

0

Я хочу создать 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;
?>

Спасибо вам всем.

  • 2
    Вы уже пробовали что-нибудь?
  • 0
    Какие решения вы внедрили?
Теги:

2 ответа

4

Вы можете создать функцию, которая создаст объект \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 добавлен таким образом, чтобы соответствовать предостережению о том, что в предыдущие месяцы последний указанный день, если начало месяца прошло "в середине недели".

  • 0
    когда я даю ** getAllDaysInAMonth (2015, 01); ** тогда понедельник 29-12-2014 не назначается
  • 0
    Это не в январе 2015 года или в 2015 году вообще. Это в декабре 2014 года.
Показать ещё 8 комментариев
1

Функция "Ниже" даст вам понедельника через месяц

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) &#37; 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;
} 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню