2013-05-22 30 views
-1

我想獲取明天的日期。但如果明天是SaturdaySunday。它將在Monday中獲得日期。它將跳過星期六和星期日。如果明天是假期,它也會跳過日期並獲得下一個日期。我有我的數據庫中的節日日期列表。PHP - '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在兩三天在一行中出現。例如,假期在5月27日和28日,那麼明天的日期應該在Wednesday

任何想法? 你能幫我嗎?

如果有其他的方法來做到這一點,我也想知道。

謝謝

+0

我的代碼結果是'$ tomorrow'是'May 25'。我認爲'while'條款是問題所在。 – kaitosenpai

+1

我認爲你最好使用日期('N')比日期('D')進行比較。日期('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;在你的函數的開頭。

如果該函數之前未返回false,則將其移至函數的末尾以返回true

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()。你在功能一開始就返回true,因此它不會允許處理剩餘的代碼,所以它應該是這樣的,

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());