PHP Date & Time: получите следующий вторник с 7 днями между - PullRequest
0 голосов
/ 12 июня 2018

Я надеюсь, что кто-то может мне помочь.Я пытаюсь создать выпадающее меню, которое показывает следующие 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 днеймежду?Надеюсь, мой вопрос понятен.Если нет, пожалуйста, дайте мне знать.

Ответы [ 5 ]

0 голосов
/ 12 июня 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

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

0 голосов
/ 12 июня 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;   
  }
}
0 голосов
/ 12 июня 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

0 голосов
/ 12 июня 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;
}
0 голосов
/ 12 июня 2018

Вы можете использовать минимальный экземпляр 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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...