サポート » 使い方全般 » 土日を除く日時取得

  • 解決済 makomako

    (@makomako)


    ホームページ上でお届けまでのスケジュールを載せたいと思っています。

    <?php echo date_i18n(“Y年m月d日”);//現在時刻まで表示 ?> 注文受付

    <?php echo date_i18n(“Y年m月d日”,strtotime(“$today +1 day +9 hours”)); ?> 制作開始

    <?php echo date_i18n(“Y年m月d日”,strtotime(“$today +2 day +9 hours”)); ?> テスト

    <?php echo date_i18n(“Y年m月d日”,strtotime(“$today +5 day +9 hours”)); ?> 商品到着

    のような形で記述しているのですが、土日が定休日のため土日を挟む場合は土日を飛ばした日付を取得したいと思っています。

    例.8月1日(金)に注文受付の場合→ ×8月2日(土)制作開始
                     ◯8月4日(月)制作開始
     
    と表示されるようにしたいのです。

    説明が下手で申し訳ないですが、どうかお教えいただければと思います。

    また土日以外にもお盆や年末年始などの特定の期間を飛ばすことが可能であればそちらもご教授頂ければ幸いです。

    どうぞよろしくお願いいたします。

15件の返信を表示中 - 1 - 15件目 (全15件中)
  • モデレーター jim912

    (@jim912)

    date_i18n( 'w' );

    で、今日の曜日を数字で取得することができます。
    この数値によって、+n day に 2が加算されるような分岐処理を行えば実現可能かと思われます。

    お盆や年末年始についても、○月○日から○月○日といったように確実に決まっているのであれば、実現できそうです。

    モデレーター Takuro Hishikawa

    (@hissy)

    トピック投稿者 makomako

    (@makomako)

    >>jim912様

    ご返答ありがとうございます。wで曜日を取得できるのは初めて知りました。分岐処理のコードについても具体的にご教授頂ければと思います。例えばその曜日取得を使って+n dayの間に土曜日、日曜日を含む場合は、結果として表示される日に土曜・日曜日を含まない日にするといったコードを教えていただきたく思います。
    当方php初心者ですので、できれば具体的に書いていただけると助かります。よろしくお願いいたします。

    トピック投稿者 makomako

    (@makomako)

    >>Takuro Hishikawa様

    ご返答ありがとうございます。GoogleChromeで和訳してみて読ませて頂いたのですが
    、正直、理解できませんでした。申し訳ございません。
    特に当方php初心者ですので、コードを記入する場合の書き方がURLの書き方ですと分かりませんでしたので、そちらもふまえてコードの実装方法をご教授頂ければと思います。

    例えばなのですが
    <?php echo date_i18n(“Y年m月d日”,strtotime(“$today +1 day +9 hours”)); ?>制作開始
    というそれぞれのコードの中に条件分岐のコードを記述するというのは出来ないのでしょうか?またそれでは無理だというのであれば、実際に書くコードをご教授お願いいたします。

    よろしくお願いいたします。

    モデレーター Takuro Hishikawa

    (@hissy)

    @makomakoさん、

    phpが書けないあなたが、書ける人に代わりに実際に動くコードを書いてほしいとお願いするのは、仕事の依頼になってしまいます。もうすこし、自分でがんばってみませんか?

    まず、jim912さんが date_i18n() 関数で曜日が取得できることを教えてくれています。

    また、私が示した参考URLのベストアンサーでは、

    $holidays = array('12-24', '12-25');
    $weekend = array('Sun','Sat');

    の様に配列で休日と土日を配列で定義し、in_array()関数によって休日、または土日に該当するかどうかを調べています。

    これらをふまえて、土日やお盆などに該当する場合、次の日を取得し直すことができそうじゃありませんか?

    モデレーター Takuro Hishikawa

    (@hissy)

    とか言いつつ、気になったのでコードも書いてしまった…。参考URLのほぼ丸パクリですが

    <?php
    $holidays = array('08-13', '08-14', '08-15'); // 休日の定義
    $weekend = array('Sun', 'Sat'); // 土日の定義
    
    $date = new DateTime(); // 現在時刻の取得
    $dateList = array(); // 日付を格納する空の配列を定義
    
    $i = 0;
    while ($i < 7) { // 直近7日間を取得
    	$date->add(DateInterval::createFromDateString('1 day')); // 1日送る
    	if (in_array($date->format('m-d'), $holidays)) continue; // 休日の場合は次の日に飛ばす
    	if (in_array($date->format('D'), $weekend)) continue; // 週末の場合は次の日に飛ばす
    	$dateList[] = clone $date;
    	$i++;
    }
    
    echo date_i18n('Y年n月j日', $dateList[0]->getTimestamp()); // 1営業日後
    echo date_i18n('Y年n月j日', $dateList[4]->getTimestamp()); // 5営業日後
    echo date_i18n('Y年n月j日', $dateList[6]->getTimestamp()); // 7営業日後

    DateTimeクラスを覚えると日付関係の処理がとても楽になります。
    また、PHP初心者でもwhile文やin_array()関数は頻出ですので、PHPマニュアルを読んで覚えておきましょう。

    トピック投稿者 makomako

    (@makomako)

    Takuro Hishikawa様

    ご返答ありがとうございます。
    コードも書いていただき本当に申し訳ございませんでした。
    初心者というより素人なのでこれからphpについて勉強して行きたいと思います。

    書いて頂いたコードを使わせて頂きWPのテンプレートに貼付けて
    1日色々試行錯誤して見たのですが、ページが白くなって表示されませんでした。

    7営業日後の後に、?>をつけてみたりしたのですが、表示されませんでした。
    現在、固定ページのテンプレートに記入しているのですが、お教えいただいたコードは
    function.phpなどの特定のページで記入しないといけないルールなどがあるのでしょうか?

    申し訳ございませんがアドバイスよろしくお願いします。

    モデレーター Takuro Hishikawa

    (@hissy)

    ページが白くなった時は、たいていの場合は500エラーが出ています。
    500エラーとは、PHPの記載に問題が合ったため、ページが表示できないと言うことです。
    単に真っ白になって手がかりが無いように見えますが、デバッグモードをオンにするとエラーの原因を表示することができます。
    http://gatespace.jp/2012/07/20/wordpress-debugging/

    トピック投稿者 makomako

    (@makomako)

    早速のご返信ありがとうございます。

    デバッグモードにしたところ
    Fatal error: Call to undefined method DateTime::ファイルのパスとその行
    がでました。

    調べたところ
    定義していない関数を呼びだそうとして起こるエラーだそうなのですが

    $holidays = array('08-13', '08-14', '08-15'); // 休日の定義
    $weekend = array('Sun', 'Sat'); // 土日の定義
    
    $date = new DateTime(); // 現在時刻の取得
    $dateList = array(); // 日付を格納する空の配列を定義

    の記述に問題があるということになるのでしょうか?

    モデレーター Takuro Hishikawa

    (@hissy)

    PHP5.2をお使いなんですね。PHP5.3以上にバージョンアップしたほうがいいですよ…。

    とか言いつつ、気になったのでコードも書いてしまった…。

    Hishikawa さん、面白すぎです。それじゃ、Unix タイムスタンプ・バージョン、PHP 2.x 用。

    $day_unit       = 60*60*24;
    $scheduled_days = array('begin' => 1, 'test' => 2, 'arrival' => 5);
    $weekend        = array('土曜日', '日曜日');
    $holidays       = array('08-13', '08-14', '08-15', '12-31', '01-01');
    $dateList       = array();
    $dateList['ordered'] = $time = current_time('timestamp');
    $counter = 1;
    while (true) {
    	$time += $day_unit;
    	if (in_array(date_i18n('l', $time), $weekend)) continue;
    	if (in_array(date_i18n('m', $time).'-'.date_i18n('d', $time), $holidays)) continue;
    	if ($counter == $scheduled_days['begin']) $dateList['begin'] = $time;
    	if ($counter == $scheduled_days['test']) $dateList['test'] = $time;
    	if ($counter == $scheduled_days['arrival']) {
    		$dateList['arrival'] = $time;
    		break;
    	}
    	$counter++;
    }
    echo date_i18n('Y年m月d日', $dateList['ordered']);
    echo date_i18n('Y年m月d日', $dateList['begin']);
    echo date_i18n('Y年m月d日', $dateList['test']);
    echo date_i18n('Y年m月d日', $dateList['arrival']);

    @makomako さん

    PHP は 5.2.4 までサポート内ですが、WordPress 3.3 は、さすがにまずいと思いますよ。

    モデレーター Takuro Hishikawa

    (@hissy)

    おー、タイムスタンプ・バージョン!Good jobです!(めんどくさくてやらなかった人)

    トピック投稿者 makomako

    (@makomako)

    >>Takuro Hishikawa様

    phpのバージョンの問題だったのですね。その辺も含めてこれからphpについて精進して行きます。

    トピック投稿者 makomako

    (@makomako)

    >>kjmtsh様

    書いて頂いたコードを使わせて頂いたところ、バッチリ自分の希望が叶いました。本当に本当にありがとうございました。

    WordPress 3.3はまずいですか?分かりました。バージョンアップを検討させて頂きます。

    トピック投稿者 makomako

    (@makomako)

    jim912様、Takuro Hishikawa様、kjmtsh様
    私のご質問にお答え頂きありがとうございました。

    特に最後までお付き合いくださいましたTakuro Hishikawa様、求めていたコードを書いて頂いたkjmtsh様には本当に感謝です。

    これから私も自分で色々出来るようになるため、phpの勉強をさせて頂きます。
    (勉強するより前に疑問がでてきて、またフォーラムで質問したとしてもお許しください)

    皆様、本当にありがとうございました。

15件の返信を表示中 - 1 - 15件目 (全15件中)
  • トピック「土日を除く日時取得」には新たに返信することはできません。