Дата и время PHP: получить следующий вторник с 7 днями между

Я надеюсь, что кто-нибудь сможет мне помочь. Я пытаюсь создать раскрывающееся меню, которое показывает следующие 4-6 вторников с правильной датой. Это уже работает. Проблема в том, что мне нужно следующее:

Если сегодня среда, раскрывающийся список должен начинаться с первого вторника, НО не со следующей недели, а со вторника с недели, следующей за следующей. Почему? Потому что между регистрацией и доставкой мне всегда нужны полные 7 дней.

Итак, если сегодня понедельник, следующий (первый) вторник должен быть вторником следующей недели. Также допустим, что сегодня пятница, тогда мой раскрывающийся список не должен начинаться со вторника со следующей недели, вместо этого со вторника с недели, следующей за следующей.

Что-то вроде: Сегодня понедельник - завтра будет вторник, но между ними нет 7 дней, поэтому должен быть показан вторник со следующего дня.

Вот что у меня есть на данный момент:

$begin = new DateTime('tuesday this week');
$end = new DateTime('last tuesday of next month');

$interval = new DateInterval( 'P1W' );
$daterange = new DatePeriod( $begin, $interval ,$end );

<select class='form-control margin-bottom-20' name='delivery_first' required>
    foreach($daterange as $date){
        <option value='".$date->format('d.m.Y')."'>"; echo $date->format('l'); echo $date->format('d.m.Y'); print"</option>
    }
</select>

Есть идеи, как я могу реализовать проверку, если между ними 7 дней? Надеюсь, мой вопрос ясен. Если нет, дайте мне знать.


person Christoph C.    schedule 12.06.2018    source источник
comment
Что, если сегодня вторник, 23:59? На следующей неделе или на две недели вперед?   -  person Andreas    schedule 12.06.2018
comment
Когда следующий вторник окажется меньше, чем через 7 дней от текущей недели? Если сегодня среда, то следующий вторник будет через шесть дней. Даже если сегодня вторник, до следующего вторника еще <7 дней. Почему бы просто не потянуть на вторник следующей недели?   -  person Winch    schedule 13.06.2018


Ответы (5)


Вы можете использовать минимальный экземпляр datetime для сравнения.

$begin = new DateTime('next tuesday');
$min = new DateTime('+7 days');
$interval = new DateInterval( 'P1W' );

if ($begin < $min) {
    $begin->add($interval);
}

Однако, если вам всегда нужно два вторника, это простое изменение может сработать:

$begin = new DateTime('next tuesday +7 days');
person Devon    schedule 12.06.2018

Вы можете использовать strtotime(), чтобы получить временную метку unix (значение в секундах) вашей даты и использовать ее для сравнения промежутков времени между двумя датами.

$now = strtotime('now');
$begin = new DateTime('tuesday this week');

$seconds_between_now_and_tuesday = (strtotime($begin) - strtotime($now));
$days_between_now_and_tuesday = $seconds_between_now_and_tuesday / 86400; //86,400 seconds in a day
if($days_between_now_and_tuesday < 7) {
    $begin = new DateTime('tuesday next week');
}

http://php.net/manual/en/function.strtotime.php

person Winch    schedule 12.06.2018

Это всего лишь псевдокод, поэтому не копируйте и вставляйте его просто так. Я думаю, вам нужен оператор switch для вашей даты начала $.

switch($todayDay){

    case Wednesday, Thursday, Friday:
        $begin = new DateTime('tuesday 2 weeks');
        break;

    case Monday, Tueday:
        $begin = new DateTime('tuesday this week');
        break;
}
person Derwoody    schedule 12.06.2018

Вы также можете попробовать это.

// create date object
$d2 = new DateTime();  

//Add 6 days to the object, should be atleast six days in between 
$d2->add(new DateInterval("P6D")); 

//  Start counting from after 6 days, take the first 
//  tuesday after 6 days and print the date and break out of the loop

for($i=1; $i<7; $i++){  
 $j="P1D";
 $d2->add(new DateInterval($j));
 $date2 = date('l',$d2->getTimeStamp());  
  if(strtolower($date2) == 'tuesday'){

      echo $d2->format('Y-m-d H:i:s');
     break;   
  }
}
person Sugumar Venkatesan    schedule 12.06.2018

Strtotime может считывать дату и время в коде YWwwd, например 2018W242, который переводится в 2018 неделю 24 день 2.

Имея это в виду, мы можем просто посмотреть, какой сегодня день недели, затем добавить к переменной начала недели 1 или 2.
Затем просто зациклить и повторить эхо в соответствии с указанным выше форматом.
Обычно strtotime и date меньше по памяти и времени выполнения, чем datetime.

If(date("N")>1){
   $w = date("W")+2;
}Else{
   $w =date("W")+1;
}

$y = date("Y");
$d = date("Y\WWN", strtotime($y . "W" . $w . "2"));

For($i=1; $i<7;$i++){
    Echo date("Y-m-d", strtotime($d)+(86400*7)*$i) ."\n";
}

https://3v4l.org/SMaou

Отредактировал код, заметил, что он не работал в прошлом году

person Andreas    schedule 12.06.2018