Получение всех дат в течение многих понедельников и вторников в течение следующего года

Я должен произвести список дат (только понедельники и вторники) в течение следующих 12 месяцев с текущей даты как так:

Jan 2010
Вторник 12 января 2010
Понедельник 18 января 2010
Вторник 19 января 2010
Понедельник 25 января 2010
Февраль 2010
Вторник 02 февраля 2010
Понедельник 08 февраля 2010
Вторник 09 февраля 2010
Понедельник 15 февраля 2010
Вторник 16 февраля 2010
Понедельник 22 февраля 2010
Март 2010
Вторник 09 марта 2010
Понедельник 15 марта 2010
Вторник 16 марта 2010
...

Будучи в новинку для PHP, который я изобразил, strtotime и цикличное выполнение за следующие 52 недели являются лучшим способом пойти.

$blockedDatesInput = "08 Mar 2010,12 Apr 2010"; // dont show these dates
$blockedDates = explode ("," , $blockedDatesInput); // convert to array
$currentMonth = ""; // current month marker

// loop over the next 52 weeks to find Mondays and Tuesdays
for($i=0; $i<=52; $i++){
// build the month header
$monthReference = date("M Y", strtotime('+'.$i.' Week'));

// check if date exists in $blockeddate
if (!in_array(date("d M Y", strtotime('+'.$i.' Monday')), $blockedDates) || 
    !in_array(date("d M Y", strtotime('+'.$i.' Tuesday')), $blockedDates) ) {
     // check if we have to show a new month
     if(strcmp($monthReference, $currentMonth) <> 0){
       echo $monthReference.'<br />',"\n";
     }else{
      // output the dates
      echo date("D d M Y", strtotime('+'.$i.' Monday')).'<br />',"\n";
      echo date("D d M Y", strtotime('+'.$i.' Tuesday')).'<br />',"\n";
     }
       $currentMonth = date("M Y", strtotime('+'.$i.' Week'));
   }
}

Однако вывод от моего кода

Jan 2010
Понедельник 18 января 2010
Вторник 12 января 2010
Понедельник 25 января 2010
Вторник 19 января 2010
Февраль 2010
Понедельник 08 февраля 2010
Вторник 02 февраля 2010
Понедельник 15 февраля 2010
Вторник 09 февраля 2010
Понедельник 22 февраля 2010
Вторник 16 февраля 2010
Март 2010
Понедельник 08 марта 2010
Вторник 02 марта 2010
Понедельник 15 марта 2010
Вторник 09 марта 2010
Понедельник 22 марта 2010
Вторник 16 марта 2010
Понедельник 29 марта 2010
Вторник 23 марта 2010

Поскольку Вы видите, что даты не находятся в правильном порядке, и я в замешательстве, где я иду не так, как надо здесь.

Существует ли более изящное / простой способ решить это?

Версия используемой PHP 5.2.11 и никакая перспектива движения к 5,3 в ближайшее время:-(

Спасибо за помощь.

Код ниже модификации, как предложено Aly. Измененный компьютерная дата со вторника, 01.12.2010 до среды, 13.01.2010 для тестирования вывода.

$blockedDatesInput = "08 Mar 2010,12 Apr 2010"; // dont show these dates
$blockedDates = explode ("," , $blockedDatesInput); // convert to array
$currentMonth = ""; // current month marker

// loop over the next 52 weeks to find Mondays and Tuesdays
for($i=0; $i<=52; $i++){
// build the month header
$monthReference = date("M Y", strtotime('+'.$i.' Week'));

// check if date exists in $blockeddate
if (!in_array(date("d M Y", strtotime('+'.$i.' Monday')), $blockedDates) || 
    !in_array(date("d M Y", strtotime('+'.$i.' Tuesday')), $blockedDates) ) {
     // check if we have to show a new month
     if(strcmp($monthReference, $currentMonth) <> 0){
       echo $monthReference.'<br />',"\n";
     }else{
      // output the dates (changed the order as suggested by Aly)
      echo date("D d M Y", strtotime('+'.$i.' Tuesday')).'<br />',"\n";
      echo date("D d M Y", strtotime('+'.$i.' Monday')).'<br />',"\n";          
     }
       $currentMonth = date("M Y", strtotime('+'.$i.' Week'));
   }
}

Вывод снова в неправильном порядке.

Jan 2010
Вторник 19 января 2010
Понедельник 18 января 2010
Вторник 26 января 2010
Понедельник 25 января 2010
Февраль 2010
Вторник 09 февраля 2010
Понедельник 08 февраля 2010
Вторник 16 февраля 2010
Понедельник 15 февраля 2010
Вторник 23 февраля 2010
Понедельник 22 февраля 2010

9
задан interrogativus 12 January 2010 в 00:37
поделиться

3 ответа

Это интересный. Вот как я бы сделаю это с функциями, хотя это может оправдать свой класс на самом деле быть модульным и многоразовым:

Set up my date formats and excluded dates
define('INTERNAL_FORMAT', 'Y-m-d');
define('DISPLAY_MONTH_FORMAT', 'M Y');
define('DISPLAY_DAY_FORMAT', 'D d M Y');
// format excluded dates as YYYY-MM-DD, date('Y-m-d'):
$excluded_dates = array(
    '2010-03-09',
    '2010-04-13',
);

, тогда мне нужны некоторые полезные функции, чтобы увидеть, как выполняется даты, и какие даты исключены:

// date('w') returns a string numeral as follows:
//   '0' Sunday
//   '1' Monday
//   '2' Tuesday
//   '3' Wednesday
//   '4' Thursday
//   '5' Friday
//   '6' Saturday
function isTuesday($date) {
    return date('w', strtotime($date)) === '2';
}
function isWednesday($date) {
    return date('w', strtotime($date)) === '3';
}

// handle the excluded dates
function isExcludedDate($internal_date) {
    global $excluded_dates;
    return in_array($internal_date, $excluded_dates);
}

сейчас Нам просто нужно повторять каждый день из следующих 365 (в следующем году) и проверять, если они вторник или среда, а не в исключительном списке. Мы храним это в $ Mijans_and_dates :

$start_date = date(INTERNAL_FORMAT);

// something to store months and days
$months_and_dates = array();

// loop over 365 days and look for tuesdays or wednesdays not in the excluded list
foreach(range(0,365) as $day) {
    $internal_date = date(INTERNAL_FORMAT, strtotime("{$start_date} + {$day} days"));
    $this_day = date(DISPLAY_DAY_FORMAT, strtotime($internal_date));
    $this_month = date(DISPLAY_MONTH_FORMAT, strtotime($internal_date));
    if ((isTuesday($internal_date) || isWednesday($internal_date)) 
        && !isExcludedDate($internal_date)) {
            $months_and_dates[$this_month][] = $this_day;
    }
}

Вы можете print_r () IT, или чтобы получить желаемое отображение, мы делаем это:

foreach($months_and_dates as $month => $days) {
    print $month . "<br>";
    print implode('<br>', $days);
    print "<br>";
}

Вот результат на сегодняшний день , 11 января 2010 года:

Jan 2010
Tue 12 Jan 2010
Wed 13 Jan 2010
Tue 19 Jan 2010
Wed 20 Jan 2010
Tue 26 Jan 2010
Wed 27 Jan 2010
Feb 2010
Tue 02 Feb 2010
Wed 03 Feb 2010
Tue 09 Feb 2010
Wed 10 Feb 2010
Tue 16 Feb 2010
Wed 17 Feb 2010
Tue 23 Feb 2010
Wed 24 Feb 2010
Mar 2010
Tue 02 Mar 2010
Wed 03 Mar 2010
Wed 10 Mar 2010
Tue 16 Mar 2010
Wed 17 Mar 2010
Tue 23 Mar 2010
Wed 24 Mar 2010
Tue 30 Mar 2010
Wed 31 Mar 2010
Apr 2010
Tue 06 Apr 2010
Wed 07 Apr 2010
Wed 14 Apr 2010
Tue 20 Apr 2010
Wed 21 Apr 2010
Tue 27 Apr 2010
Wed 28 Apr 2010
May 2010
Tue 04 May 2010
Wed 05 May 2010
Tue 11 May 2010
Wed 12 May 2010
Tue 18 May 2010
Wed 19 May 2010
Tue 25 May 2010
Wed 26 May 2010
Jun 2010
Tue 01 Jun 2010
Wed 02 Jun 2010
Tue 08 Jun 2010
Wed 09 Jun 2010
Tue 15 Jun 2010
Wed 16 Jun 2010
Tue 22 Jun 2010
Wed 23 Jun 2010
Tue 29 Jun 2010
Wed 30 Jun 2010
Jul 2010
Tue 06 Jul 2010
Wed 07 Jul 2010
Tue 13 Jul 2010
Wed 14 Jul 2010
Tue 20 Jul 2010
Wed 21 Jul 2010
Tue 27 Jul 2010
Wed 28 Jul 2010
Aug 2010
Tue 03 Aug 2010
Wed 04 Aug 2010
Tue 10 Aug 2010
Wed 11 Aug 2010
Tue 17 Aug 2010
Wed 18 Aug 2010
Tue 24 Aug 2010
Wed 25 Aug 2010
Tue 31 Aug 2010
Sep 2010
Wed 01 Sep 2010
Tue 07 Sep 2010
Wed 08 Sep 2010
Tue 14 Sep 2010
Wed 15 Sep 2010
Tue 21 Sep 2010
Wed 22 Sep 2010
Tue 28 Sep 2010
Wed 29 Sep 2010
Oct 2010
Tue 05 Oct 2010
Wed 06 Oct 2010
Tue 12 Oct 2010
Wed 13 Oct 2010
Tue 19 Oct 2010
Wed 20 Oct 2010
Tue 26 Oct 2010
Wed 27 Oct 2010
Nov 2010
Tue 02 Nov 2010
Wed 03 Nov 2010
Tue 09 Nov 2010
Wed 10 Nov 2010
Tue 16 Nov 2010
Wed 17 Nov 2010
Tue 23 Nov 2010
Wed 24 Nov 2010
Tue 30 Nov 2010
Dec 2010
Wed 01 Dec 2010
Tue 07 Dec 2010
Wed 08 Dec 2010
Tue 14 Dec 2010
Wed 15 Dec 2010
Tue 21 Dec 2010
Wed 22 Dec 2010
Tue 28 Dec 2010
Wed 29 Dec 2010
Jan 2011
Tue 04 Jan 2011
Wed 05 Jan 2011
Tue 11 Jan 2011
12
ответ дан 4 December 2019 в 19:33
поделиться

В забавном совпадении, потому что сегодня в понедельник он пропускает одно понедельник, поэтому они появляются из строя. Вчера это было бы нормально.

I.e. Ваш «+ 0 понедельник» следующий понедельник, а сегодня.

Вы можете посмотреть в символ «n» формата для даты ().

0
ответ дан 4 December 2019 в 19:33
поделиться
[11744522-

Теперь, когда ваши компьютеры дата в среду, вы хотите распечатать по понедельникам до вторников, поскольку в следующем понедельник ближе к среду, чем в следующий вторник. Так что попробуй это:

$blockedDatesInput = "08 Mar 2010,12 Apr 2010"; // dont show these dates
$blockedDates = explode ("," , $blockedDatesInput); // convert to array
$currentMonth = ""; // current month marker

// loop over the next 52 weeks to find Mondays and Tuesdays
for($i=0; $i<=52; $i++){
// build the month header
$monthReference = date("M Y", strtotime('+'.$i.' Week'));

// check if date exists in $blockeddate
if (!in_array(date("d M Y", strtotime('+'.$i.' Monday')), $blockedDates) || 
    !in_array(date("d M Y", strtotime('+'.$i.' Tuesday')), $blockedDates) ) {
     // check if we have to show a new month
     if(strcmp($monthReference, $currentMonth) <> 0){
       echo $monthReference.'<br />',"\n";
     }else{
      // output the dates (changed the order as suggested by Aly)
      echo date("D d M Y", strtotime('+'.$i.' Monday')).'<br />',"\n";          
      echo date("D d M Y", strtotime('+'.$i.' Tuesday')).'<br />',"\n";
     }
       $currentMonth = date("M Y", strtotime('+'.$i.' Week'));
   }
}
0
ответ дан 4 December 2019 в 19:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: