我想明天约会。但如果明天是Saturday
或Sunday
。它将在Monday
中获取日期。它将跳过周六和周日。此外,如果明天是假日,它将跳过日期并获得下一个日期。我的数据库中有假日日期列表。
我正在尝试这段代码。假设今天是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 :(得分:0)
正如Syjin已经说过的那样,check_valid()
将永远返回true
,因为您在函数开头已经有return true;
。
如果函数之前没有返回true
,请将其移至函数末尾以返回false
。
答案 1 :(得分: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;
}
答案 2 :(得分: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;
}
答案 3 :(得分: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');
?>
一开始是2013年5月24日 - 星期五。然后它加1。 25和26是星期六和星期日,因此它会跳过它们并打印2013-05-27。
答案 4 :(得分: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;
}
}
希望它有效..:)
答案 5 :(得分: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());