- ベストアンサー
明日以降の平日表示
ちょっと頭がこんがらがってわからなくなってしまいました。 明日以降の平日の日付を取得・表示するスクリプトを考えております。 ========= <? $youbi = array("日","月","火","水","木","金","土"); $d=mktime(0,0,0,date("m"),date("d")+1,date("y")); if(date("w",$d)==6) $d=$d+60*60*24*2; if(date("w",$d)==0) $d=$d+60*60*24*2; $theday = date("Y年m月d日",$d)." (".$youbi[date("w",$d)].")"; print $theday; ?> <? $youbi = array("日","月","火","水","木","金","土"); $d=mktime(0,0,0,date("m"),date("d")+2,date("y")); if(date("w",$d)==6) $d=$d+60*60*24*2; if(date("w",$d)==0) $d=$d+60*60*24*2; $theday = date("Y年m月d日",$d)." (".$youbi[date("w",$d)].")"; print $theday; ?> <? $youbi = array("日","月","火","水","木","金","土"); $d=mktime(0,0,0,date("m"),date("d")+3,date("y")); if(date("w",$d)==6) $d=$d+60*60*24*2; if(date("w",$d)==0) $d=$d+60*60*24*2; $theday = date("Y年m月d日",$d)." (".$youbi[date("w",$d)].")"; print $theday; ?> <? $youbi = array("日","月","火","水","木","金","土"); $d=mktime(0,0,0,date("m"),date("d")+4,date("y")); if(date("w",$d)==6) $d=$d+60*60*24*2; if(date("w",$d)==0) $d=$d+60*60*24*2; $theday = date("Y年m月d日",$d)." (".$youbi[date("w",$d)].")"; print $theday; ?> この方法だとなぜか、 ============ 2007年08月27日 (月) 2007年08月28日 (火) 2007年08月27日 (月) 2007年08月28日 (火) ============ となります。 どこがおかしいのでしょうか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
>ページ内のほかの要素の都合でfor文を使わないで書きたいのですが >それは可能でしょうか? 意味がうまく理解できません。 前回のように関数化してしまえば、変数が絡むこともないし、とくに forによって問題になることは皆無だとおもいますが・・・。 とはいえ、参考までに以下のようにかいてみました。 冗長なソースになるのでお勧めはできません。 <?PHP $d=mktime(0,0,0,date("m"),date("d"),date("Y")); after5daysNotFor($d); print "<hr>"; $d=mktime(0,0,0,date("m"),date("d")+1,date("Y")); after5daysNotFor($d); print "<hr>"; $d=mktime(0,0,0,date("m"),date("d")+2,date("Y")); after5daysNotFor($d); print "<hr>"; $d=mktime(0,0,0,date("m"),date("d")+3,date("Y")); after5daysNotFor($d); print "<hr>"; $d=mktime(0,0,0,date("m"),date("d")+4,date("Y")); after5daysNotFor($d); print "<hr>"; $d=mktime(0,0,0,date("m"),date("d")+5,date("Y")); after5daysNotFor($d); print "<hr>"; $d=mktime(0,0,0,date("m"),date("d")+6,date("Y")); after5daysNotFor($d); function after5daysNotFor($d){ $youbi = array("日","月","火","水","木","金","土"); print date("Y年m月d日",$d)." (".$youbi[date("w",$d)].")以降の平日5日間<br>"; $d+=60*60*24*((date("w",$d)==5)?3:(date("w",$d)==6?2:1)); print date("Y年m月d日",$d)." (".$youbi[date("w",$d)].")<br>"; $d+=60*60*24*((date("w",$d)==5)?3:(date("w",$d)==6?2:1)); print date("Y年m月d日",$d)." (".$youbi[date("w",$d)].")<br>"; $d+=60*60*24*((date("w",$d)==5)?3:(date("w",$d)==6?2:1)); print date("Y年m月d日",$d)." (".$youbi[date("w",$d)].")<br>"; $d+=60*60*24*((date("w",$d)==5)?3:(date("w",$d)==6?2:1)); print date("Y年m月d日",$d)." (".$youbi[date("w",$d)].")<br>"; $d+=60*60*24*((date("w",$d)==5)?3:(date("w",$d)==6?2:1)); print date("Y年m月d日",$d)." (".$youbi[date("w",$d)].")<br>"; } ?>
その他の回答 (6)
- yambejp
- ベストアンサー率51% (3827/7415)
あー・・・なんとなくわかってきました。 こんな感じでよいですか? <? $d=mktime(0,0,0,date("m"),date("d"),date("Y")); after5days($d); print "<hr>"; $d=mktime(0,0,0,date("m"),date("d")+1,date("Y")); after5days($d); print "<hr>"; $d=mktime(0,0,0,date("m"),date("d")+2,date("Y")); after5days($d); print "<hr>"; $d=mktime(0,0,0,date("m"),date("d")+3,date("Y")); after5days($d); print "<hr>"; $d=mktime(0,0,0,date("m"),date("d")+4,date("Y")); after5days($d); print "<hr>"; $d=mktime(0,0,0,date("m"),date("d")+5,date("Y")); after5days($d); print "<hr>"; $d=mktime(0,0,0,date("m"),date("d")+6,date("Y")); after5days($d); print "<hr>"; function after5days($d){ $youbi = array("日","月","火","水","木","金","土"); print date("Y年m月d日",$d)." (".$youbi[date("w",$d)].")以降の平日5日間<br>"; for($i=0;$i<5;$i++){ $d+=60*60*24; if(date("w",$d)==6) $d+=60*60*24; if(date("w",$d)==0) $d+=60*60*24; $theday = date("Y年m月d日",$d)." (".$youbi[date("w",$d)].")"; print $theday."<br>"; } } ?>
補足
動きは希望通りです。有難うございます。 ページ内のほかの要素の都合でfor文を使わないで書きたいのですが それは可能でしょうか?
- yambejp
- ベストアンサー率51% (3827/7415)
あれ? >2007年08月27日 (月) >2007年08月27日 (月) >2007年08月27日 (月) >2007年08月28日 (火) >になってしまいます。 こうなってはだめなんですか? 単純に土日を表示しないのであれば・・・ こんな感じ <? for($i=0;$i<20;$i++){ $youbi = array("日","月","火","水","木","金","土"); $d=mktime(0,0,0,date("m"),date("d")+$i,date("Y")); if(date("w",$d)!=6 AND date("w",$d)!=0){ $theday = date("Y年m月d日",$d)." (".$youbi[date("w",$d)].")"; print $theday."<br>"; } } ?>
補足
あ、えっと凄く近づいてきました。 でも土・日の場合は翌週の月・日が出力されるようにしたいです。 その後は後ずれしてゆく感じです。 5日後までの出力です。 ですので希望は、 ======= <本日処理した場合> 2007年08月27日 (月) 2007年08月28日 (火) 2007年08月29日 (水) 2007年08月30日 (金) 2007年08月31日 (土) ======= こんな感じです。
- asuncion
- ベストアンサー率33% (2127/6289)
> 週をまたがった場合はなんか処理が必要な気がしてきました。 では、どういった結果がほしいのでしょうか? もともと投稿されたスクリプトや私のサンプルでは、 n日後が月~金だったらそのまま出力しているだけです。 他の加工が必要なのでしょうか?
補足
はい。他の加工が必要です。 動きの希望としては n日後が土あるいは日だった場合は翌週の月あるいは火と出力され、その次に表示されるべきだった月と火は水と木と表示されてそのまま後連れしてゆく感じです。 ちなみに5日分です。 ですので本日動かした場合は ====== 2007年08月27日 (月) 2007年08月28日 (火) 2007年08月29日 (水) 2007年08月30日 (木) 2007年08月31日 (金) ====== と表示させたいのです。
- yambejp
- ベストアンサー率51% (3827/7415)
よくみたら以前私がかいたやつですね・・・ 日曜日に2日足してますよね?1日足せば月曜ですよ http://oshiete1.goo.ne.jp/qa3136693.html
補足
そうなんです。 その節は有難うございました。 それで動かしていたのですが、週をまたがった場合なぜか 月曜と火曜がダブルのです。 木・金・土にこのスクリプトが動くページを見ると 月曜と火曜が(あるいは片方)がダブルのです。 週を超えた場合に別処理が必要になることを今考えております
- asuncion
- ベストアンサー率33% (2127/6289)
先ほどの回答をした者です。 もしも祝日のことを意識する必要がある場合は、 先ほどのサンプル・スクリプトを適当に修正してください。
補足
参考意見有難うございます。 祝日は考慮していただかなくて大丈夫です。 申し遅れてすみません
- asuncion
- ベストアンサー率33% (2127/6289)
サンプルです。 <?php $youbi = array("日", "月", "火", "水", "木", "金", "土"); $oneday = 60 * 60 * 24; for ($i = 1; $i <= 10; $i++) { $d = mktime(0, 0, 0, date("m"), date("d") + $i, date("y")); if (date("w", $d) == 6) $d += $oneday * 2; else if (date("w", $d) == 0) $d += $oneday; $theday = date("Y年m月d日", $d) . " (" . $youbi[date("w", $d)] . ")<br />"; print $theday; } ?>
補足
参考意見有難うございます。 施工してみると === 2007年08月27日 (月) 2007年08月27日 (月) 2007年08月27日 (月) 2007年08月28日 (火) ・ ・ ・ === になってしまいます。 っということは、 週をまたがった場合はなんか処理が必要な気がしてきました。
お礼
幾度もお付き合いいただき有難うございました。 組み込みが完成したページをお見せしたいぐらいですが 控えます。^^; 有難うございました。