0

明日の日付を取得したい。しかし、もし明日が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;
    }
}

句を使用しているのは、2、3 日連続して表示されるwhileものがあると想定しているためです。holiday dateたとえば、祝日が 5 月 27 日と 28 日である場合、明日の日付は になりますWednesday

何か案は?私を手伝ってくれますか?

これを達成するための別のアプローチがある場合は、それも知りたいです。

ありがとうございました、

4

6 に答える 6

0

Syjin が既に言ったように、関数の先頭にがあるため、check_valid()常に戻ります。truereturn true;

true関数が以前に戻っていない場合は、関数の最後に移動して戻りますfalse

于 2013-05-22T09:56:47.803 に答える
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 を出力します。

于 2013-05-22T10:06:33.553 に答える
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;
    }
}

うまくいけばうまくいく..:)

于 2013-05-22T10:06:33.997 に答える
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());
于 2013-05-22T10:11:13.917 に答える
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;
}
于 2013-05-22T09:58:29.973 に答える
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;
}
于 2013-05-22T09:58:00.403 に答える