Как получить даты понедельника и среды каждые 2 недели между двумя датами - PullRequest
0 голосов
/ 20 июня 2019

Как получить даты понедельника и среды после каждой второй недели с заданной даты начала и окончания

Например

Start date  : 01-01-2019
End Date  : 05-03-2019

Понедельник и среда Каждую вторую неделю

Итак, следующие даты должны быть в списке

Wednesday  : 02-01-2019
Monday     : 14-01-2019
Wednesday  : 16-01-2019
Monday     : 28-01-2019
Wednesday  : 30-01-2019
Monday     : 11-02-2019
Wednesday  : 13-02-2019
Monday     : 25-02-2019
Wednesday  : 27-02-2019

$startDate = '01-01-2019';
$endDate = '01-03-2019';
$day_number = '1';
$ofWeek = '2';
getDateForSpecificDayBetweenDates($startDate,$endDate,$day_number,$ofWeek);
function getDateForSpecificDayBetweenDates($startDate,$endDate,$day_number,$ofWeek){
    $endDate = strtotime($endDate);
    $days=array('1'=>'Monday','2' => 'Tuesday','3' => 'Wednesday','4'=>'Thursday','5' =>'Friday','6' => 'Saturday','7'=>'Sunday');
    $date_array = array();
    $cnt=0;
    for($i = strtotime($days[$day_number], strtotime($startDate)); $i <= $endDate; $i = strtotime('+1 week', $i))
    {
        $weeknumber = weekOfMonth(date('Y-m-d',$i));
        echo "Week : ".$weeknumber.'  -  Date : '.date('Y-m-d',$i)."<br>";
        if($weeknumber == $ofWeek){
            $date_array[$cnt]['dates']=date('Y-m-d',$i);
            $date_array[$cnt]['week']=$weeknumber;
            $cnt++;
        }
    }

    echo "<pre>";print_r($date_array);echo "<pre>";
}
function weekOfMonth($date) {
    // estract date parts
    list($y, $m, $d) = explode('-', date('Y-m-d', strtotime($date)));

    // current week, min 1
    $w = 1;

    // for each day since the start of the month
    for ($i = 1; $i <= $d; ++$i) {
        // if that day was a sunday and is not the first day of month
        if ($i > 1 && date('w', strtotime("$y-$m-$i")) == 0) {
            // increment current week
            ++$w;
        }
    }

    // now return
    return $w;
}

Я разработал этот код, но он дает мне только 2 недели в месяц, которые мне нужны каждые 2 недели после даты начала

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

Будет выделена любая помощь

Ответы [ 4 ]

1 голос
/ 20 июня 2019
<?php
$date1 = new DateTime('01-01-2019');
$date2 = new DateTime('05-03-2019');
$interval = $date1->diff($date2);


$weekday = ['monday','tuesday','wednesday','thursday','friday','saturday','sunday'];

while($date1<$date2)
{
    $day_of_week = intval($date1->format('w'));
    if($day_of_week>=1 && $day_of_week<3)
    {
        $addDays=3-$day_of_week;
    }else{
        $addDays=15-$day_of_week;
    }
    $date1->modify('+' . $addDays . ' day');

    $day_of_week = intval($date1->format('w')) - 1;

    if($date1<$date2)
    {
        echo $weekday[$day_of_week] . ' - ' . $date1->format('d-m-Y') . '<br>';
    }
}



?>

Вы попробуете это на php fiddle.

Сначала я получил выходной день недели.

Затем проверил, понедельник или вторник, если это будет, тогда получим diffrence от 3, потому чтоСреда - третий день недели и добавьте его в день.

тогда у вас есть понедельник, который должен быть вторым понедельником после среды.

Разница между двумя понедельниками составляет 15 дней, следовательно, вычитание из15.

Вот выход.

wednesday - 02-01-2019
monday - 14-01-2019
wednesday - 16-01-2019
monday - 28-01-2019
wednesday - 30-01-2019
monday - 11-02-2019
wednesday - 13-02-2019
monday - 25-02-2019
wednesday - 27-02-2019
1 голос
/ 20 июня 2019

Это выглядело как забавное испытание.

Вот один из способов использования объектов DateTime и функции ->modify() для перехода к следующему понедельнику и среде.

<?php

$start_date = '01-01-2019';
$end_date = '05-03-2019';

$sd = new DateTimeImmutable($start_date);
$nd = new DateTime($start_date);
$ed = new DateTimeImmutable($end_date);
echo 'Start Date = ' . $sd->format('D Y-m-d').PHP_EOL;

// check if the next date from the start date is a monday or a wednesday
// and output the first date accordingly
if ( $sd->modify('next monday') < $sd->modify('next wednesday')) {
    echo '>>>' . $nd->modify('next monday')->format('D d/m/Y'). PHP_EOL;
    echo '>>>' . $nd->modify('next wednesday')->format('D d/m/Y'). PHP_EOL;
}else{
    echo '>>>' . $nd->modify('next wednesday')->format('D d/m/Y'). PHP_EOL;
}

while (1) {
    // add 7 days
    $nd->add(new DateInterval('P7D'));
    // go to next monday unless that means we went past the end date
    if ( $nd->modify('next monday') > $ed ) { break; }
    echo '>>>' . $nd->format('D d/m/Y'). PHP_EOL;

    // go to next wednesday unless that means we went past the end date
    if ( $nd->modify('next wednesday') > $ed ) { break; }
    echo '>>>' . $nd->format('D d/m/Y'). PHP_EOL;
}

Результаты

Start Date = Tue 2019-01-01
>>>Wed 02/01/2019
>>>Mon 14/01/2019
>>>Wed 16/01/2019
>>>Mon 28/01/2019
>>>Wed 30/01/2019
>>>Mon 11/02/2019
>>>Wed 13/02/2019
>>>Mon 25/02/2019
>>>Wed 27/02/2019
1 голос
/ 20 июня 2019

Вы можете использовать DatePeriod для достижения этого:

$begin = new DateTime('2019-01-01');
$end = new DateTime('2019-03-05');
$interval = new DateInterval('P2W');
$period = new DatePeriod($begin, $interval, $end);

$dates = [];

foreach ($period as $date) {
    $wednesday = $date->modify('next wednesday');
    $monday = (clone $wednesday)->modify('+1 week next monday');

    if ($wednesday < $end) {
        $dates[] = $wednesday;
    }

    if ($monday < $end) {
        $dates[] = $monday;
    }
}

foreach ($dates as $date) {
    echo $date->format('D: d-m-Y') . '<br />';
}

Результат:

Wed: 02-01-2019
Mon: 14-01-2019
Wed: 16-01-2019
Mon: 28-01-2019
Wed: 30-01-2019
Mon: 11-02-2019
Wed: 13-02-2019
Mon: 25-02-2019
Wed: 27-02-2019

Проверьте это здесь

0 голосов
/ 20 июня 2019

Попробуйте эту функцию передать две отметки времени даты:

<?php 


function get_date($startDateTime,$repeat_until){

    for ($i = $startDateTime; $i <= $repeat_until; $i+=86400) {
                    $ShowDay_arr = array(1, 3);
                    $Newdate = $i;
                    $Numerday=date("N",$Newdate);
                    if(in_array($Numerday,$ShowDay_arr)){
                        $day = date("D", $Newdate);
                        echo "<b> Day : ".$day."</b> (".date("d-m-Y",$Newdate).")";
                        echo "<br>";
                    }



    }
}
get_date(1559401144,1561906744);
?>


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...