2013-05-22 158 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());