PHP-循环while';假';,在'时停止;正确';
我想要明天的约会。但是如果明天是星期六或星期天。它将在PHP-循环while';假';,在'时停止;正确';,php,Php,我想要明天的约会。但是如果明天是星期六或星期天。它将在星期一中获取日期。它将跳过周六和周日。另外,如果明天是假日,它将跳过日期并获得下一个日期。我的数据库中有假期日期的列表 我正在尝试这个代码。假设今天是5月24日星期五 $today = "2013-05-24"; $tommorow = date('Y-m-d', strtotime($today . ' + 1 day')); $valid = check_valid($tommorow); while (!$valid){ $t
星期一
中获取日期。它将跳过周六和周日。另外,如果明天是假日,它将跳过日期并获得下一个日期。我的数据库中有假期日期的列表
我正在尝试这个代码。假设今天是5月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
子句,是因为我假设有一个假日日期
连续出现在两三天内。例如,假日是5月27日和28日,那么明天的日期应该是星期三
有什么想法吗?
你能帮我吗
如果你有其他方法来实现这一点,我也想知道
谢谢,正如Syjin已经说过的,您的
check\u valid()
将始终返回true
,因为您得到了一个返回true代码>在函数的开头
如果函数以前未返回false
,则将其移动到函数末尾以返回true
。此函数(使用您的逻辑)检查时间戳是否有效,如果不有效,则搜索下一个有效时间戳。它将返回可能的第一个有效时间戳的时间戳
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;
}
问题出在函数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;
}
以下是代码、操作和您需要的:
它使用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');
?>
您应该在每个循环中更新/增加“+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;
}
}
希望它能工作。:)您可以尝试这个解决方案,它基于我在几个项目中使用的工作日代码。它使用瑞典假日,但您可以根据您所在国家的节假日调整这些假期。请记住,许多假期取决于当前年份
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());
我的代码结果是$moother
是May 25
。我认为while
子句是问题所在。我认为您最好使用date('N')而不是date('D')来进行比较。日期('N')返回整数(周中的天数)。这只是一个开始。你的check\u valid函数总是返回true…看起来你只是陷入了一个infinte循环,因为它一直在使用$today+1天检查$tommorow
。。。哪一天总是星期六(如果是周末的话)。尝试使用$tommorow=date('Y-m-d',strotime('tomorow.+1天')代码>您遇到了什么问题?您只需在“check_valid”函数的末尾而不是开头返回true。