2013-05-22 2 views
-1

Я хочу получить дату завтра. Но если завтра будет Saturday или Sunday. Он получит дату в Monday. Он пропустит субботу и воскресенье. Также, если завтра будет праздник, он пропустит дату и получит следующую дату. У меня есть список даты отпуска в моей базе данных.PHP - Loop while 'false', останавливается, когда это «true»

Я пробовал этот код. Предположим, сегодня Friday, May 24.

$today = "2013-05-24"; 

$tommorow = date('Y-m-d', strtotime($today . ' + 1 day')); 
$valid = check_valid($tommorow); 
while (!$valid){ 
    $tommorow = date('Y-m-d', strtotime($today . ' + 1 day')); 
    $valid = check_valid($tommorow); 
    if($valid){ 
     break; 
    } 
} 

function check_valid($date){ 
    return true; 
    $timestamp = strtotime($date); 
    $day = date('D', $timestamp); 
    if ($day == "Sat" || $day == "Sun"){ 
     return false; 
    } 
    $mysql= mysql_query("SELECT * FROM holiday_data WHERE date = '$date'"); 
    if (mysql_num_rows($mysql) >= 1){ 
     return false; 
    } 
} 

Я использую while статью, потому что я предполагаю, что есть holiday date, который появляется в двух или трех дней подряд. Например, праздник - 27 и 28 мая, тогда завтра дата должна быть в Wednesday.

Любые идеи? Не могли бы вы мне помочь?

Если у вас есть другой подход к достижению этого, я также хочу это знать.

Спасибо,

+0

Результат моего кода «$ завтра» - это «25 мая». Я думаю, что проблема 'while' - проблема. – kaitosenpai

+1

Думаю, вам лучше использовать дату ('N'), чем дату ('D') для сравнения. date ('N') возвращает целое число (число дней в неделю). Это только начало. – netvision73

+1

Ваша функция check_valid всегда возвращает true ... – Syjin

ответ

0

Вот код, делать то, что вам нужно:

Он использует класс DateTime и цикл do-while:

<?php 
function not_valid($date){ 

     $weekday = $date->format('l'); 
     if ($weekday == "Saturday" || $weekday == "Sunday"){ 
      return true; 
     } 

     $str_date = $date->format('Y-m-d'); 

     $mysql= mysql_query("SELECT * FROM holiday_data WHERE date = '$str_date'"); 
     if (mysql_num_rows($mysql) >= 1){ 
      return true; 
     } 

     return false; 
} 

$today = new DateTime("2013-05-24"); 
do{ 
     //add 1 day 
     $today->add(new DateInterval('P1D')); 
}while(not_valid($today)); 

print $today->format('Y-m-d'); 
?> 

В начале 24.05.2013 - Пятница. Затем он добавляет 1 к нему. 25 и 26 - суббота и воскресенье, поэтому он пропускает их и распечатывает 2013-05-27.

0

Как Syjin уже сказал, ваш check_valid() всегда будет возвращать true, потому что у вас есть return true; в начале вашей функции.

Переместите его в конец вашей функции, чтобы вернуть true, если функция не была возвращена false.

0

Эта функция проверяет (с вашей логикой), если временная метка действительна и если не выполняется поиск следующей допустимой метки времени. он вернет метку первой допустимой метки времени.

function getNextValidDay($timestamp) { 
    $day = date('D', $timestamp); 
    if ($day == "Sat" || $day == "Sun"){ 
     $timestamp += 60*60*24; 
     return getNextValidDay($timestamp); 
    } 
    $mysql= mysql_query("SELECT * FROM holiday_data WHERE date = '$timestamp'"); 
    if (mysql_num_rows($mysql) >= 1){ 
     $timestamp += 60*60*24; 
     return getNextValidDay($timestamp); 
    } 
    return $timestamp; 
} 
0

Проблема заключается в функции check_valid(). Вы вернулись правда в самом начале функции, так что не позволит обрабатывать остальные код таким образом это должно быть что-то вроде этого,

function check_valid($date){ 

    $timestamp = strtotime($date); 
    $day = date('D', $timestamp); 
    if ($day == "Sat" || $day == "Sun"){ 
     return false; 
    } 
    $mysql= mysql_query("SELECT * FROM holiday_data WHERE date = '$date'"); 
    if (mysql_num_rows($mysql) >= 1){ 
     return false; 
    } 
    return true; 
} 
0

вы должны обновлять/увеличивать '+ 1 день' в каждом цикле. измените свой код, чтобы быть чем-то вроде этого

$today = "2013-05-24"; 
$ii_day = 1; 

$tommorow = date('Y-m-d', strtotime($today . ' + '.($ii_day).' day')); 
$valid = check_valid($tommorow); 
while (!$valid){ 
    $ii_day++; 
    $tommorow = date('Y-m-d', strtotime($today . ' + '.($ii_day).' day')); 
    $valid = check_valid($tommorow); 
    if($valid){ 
     break; 
    } 
} 

, а затем в функции check_valid немного измените свой код.

function check_valid($date){ 
    //return true; 
    $timestamp = strtotime($date); 
    $day = date('D', $timestamp); 
    if ($day == "Sat" || $day == "Sun"){ 
     return false; 
    } 
    else { 
     $mysql= mysql_query("SELECT * FROM holiday_data WHERE date = '$date'"); 
     if (mysql_num_rows($mysql) >= 1){ 
      return false; 
     } 
     else 
      return true; 
    } 
} 

надеюсь, он работает .. :)

0

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

function next_valid_day() { 
    $year = date('Y'); 

    $easter_date = easter_date($year); 

    $holidays = array(
         mktime(0, 0, 0, 1, 1, $year),              // Nyårsdagen 
         mktime(0, 0, 0, 1, 6, $year),              // Trettondedag jul 
         //strtotime('-3 days', $easter_date),            // Skärtorsdagen 
         strtotime('-2 days', $easter_date),            // Långfredagen 
         strtotime('-1 day', $easter_date),            // Påskafton 
         $easter_date,                  // Påskdagen 
         strtotime('+1 day', $easter_date),            // Annandag påsk 
         mktime(0, 0, 0, 5, 1, $year),              // 1:a maj 
         strtotime('+39 days', $easter_date),            // Kristi himmelsfärdsdag 
         mktime(0, 0, 0, 6, 6, $year),              // Sveriges nationaldag 
         strtotime('-1 day', strtotime('next Saturday', mktime(0, 0, 0, 6, 19, $year))), // Midsommarafton 
         mktime(0, 0, 0, 12, 24, $year),             // Julafton 
         mktime(0, 0, 0, 12, 25, $year),             // Juldagen 
         mktime(0, 0, 0, 12, 26, $year),             // Annandag jul 
         mktime(0, 0, 0, 12, 31, $year)             // Nyårsafton 
        ); 

    $valid_date = false; 
    $d = 0; 

    while ($valid_date === false) { 
     $date = strtotime('+' . ++$d . ' days'); 

     if (!in_array($date, $holidays) && !(date('N', $date) > 5)) { 
      $valid_date = true; 
     } 
    } 

    return date('Y-m-d', $date); 
} 

var_dump(next_valid_day());