โจทย์คือ สร้างปฏิทินสำหรับวางแผนงานต่างๆ โดยจะมีลักษณะแตกต่างจาก ที่ใช้ตามปกติคือ แทนที่จะแบ่งเป็นเดือนๆ จะยาวต่อกัน บางครั้งอาจมีความยาวหลายๆ เดือนติดกัน
ความยากคือ
- เมื่อกำหนดวันมาให้ สมมุติวันที่ 5 สิงหาคม 2555 จะต้องแสดงวันที่ให้ตรงกับวันที่จริงๆ วันถ้าเป็นวันศุกร์ก็ต้องแสดงให้ตรงกับสดมภ์ของวันศุกร์ (ถ้าบอกว่าให้ช่องแรกเป็นวันศุกร์ไปเลย เขียนง่ายดี ก็ได้ แต่จะอ่านยากมาก)
- ต้องแสดงอาทิตย์ที่ผ่านมา และอาทิตย์ถัดไป (อาจจะหลายเดือน) ให้สัมพันธ์กับวันที่ในข้อ 1 ถ้าได้ข้อแรกแล้ว สามารถดัดแปลงเอามาใช้ได้
- การแสดงเป็นรูปแบบปฏิทิน
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> PlusMagic's Blog</title> </head> <body> <?php /* วันที่ตั้งต้น */ $datePin = '2011-09-29'; /* จะขยายวันที่จากวันที่ตั้งต้น ย้อนกลับไป หรือล่วงหน้ากี่สัปดาห์ */ $weeksExtened = 2; $daysExtened = $weeksExtened * 7; /* หาวันที่เริ่มต้น แปลงเป็นวันที่ก่อน */ $dateTimeObjStart = new DateTime($datePin); /* หาลำดับของวัน */ $weekdate = $dateTimeObjStart->format('N'); /* หาวันที่เริ่มต้น โดย วันที่เริ่มต้น = วันที่ตั้งต้น – หาลำดับของวัน - 1 การนำวันที่ตั้งต้น - 1 คือการย้อนไปวันจันทร์ */ $dateTimeObjStart->sub(new DateInterval('P'.($weekdate + $daysExtened - 1).'D')); /* ถ้าวันที่ไม่ใช่วันจันทร์ ใช้ลำดับของวันปรับให้เป็นวันจันทร์ */ $weekdate = $dateTimeObjStart->format('N'); if($weekdate != 1){ $dateTimeObjStart->sub(new DateInterval('P'.($weekdate - 1).'D')); } $dateStart = $dateTimeObjStart->format('D Y-m-d'); /* หาวันที่สิ้นสุด */ $dateTimeObjEnd = new DateTime($datePin); $weekdate = $dateTimeObjEnd->format('N'); /* ทำกลับกันโดย นำไปบวกเพิ่ม */ $dateTimeObjEnd->add(new DateInterval('P'.($weekdate + $daysExtened - 1).'D')); /* ถ้าไม่ใช่วันอาทิตย์ */ $weekdate = $dateTimeObjEnd->format('N'); if($weekdate != 7){ $dateTimeObjEnd->add(new DateInterval('P'.(7 - $weekdate).'D')); } $dateEnd = $dateTimeObjEnd->format('D Y-m-d'); echo '<br />วันที่เริ่มต้น <b>',$dateStart,'</b> วันที่ตั้งต้น<b>',$datePin,'</b> วันที่สิ้นสุด <b>',$dateEnd,'</b>'; $daycount = $dateTimeObjStart->diff($dateTimeObjEnd); $daycount = date_diff($dateTimeObjStart ,$dateTimeObjEnd); echo '<br />ต่างกัน ',$daycount->format('%a วัน') ,' หรือ ',$daycount->format('%m เดือน %d วัน'); /* แปลงเป็นจำนวน */ $daycount = (int) $daycount->format('%a'); /* ต่อไปเป็นการสร้างปฏิทิน */ echo'<table border="1"><caption>Plan Calenda</caption>' ,'<thead><tr><th>MONDAY</th><th>TUESDAY</th><th>WEDNESDAY</th><th>THURSDAY</th><th>FRIDAY</th><th>SATURDAY</th><th>SUNDAY</th></tr></thead>' ,'<tbody>'; $weekdate = 1; for($a = 0; $a <= $daycount; $a++){ /* สร้างแถวใหม่ทุกๆ วันจันทร์ */ if($weekdate == 1){ echo'<tr>'; } echo'<td>',$dateTimeObjStart->format('D Y-m-d'),'</td>'; $dateTimeObjStart->add(new DateInterval('P1D')); /* ปิดแถวทุกๆ วันอาทิตย์ */ if($weekdate == 7){ echo'</tr>'; $weekdate = 1; }else{ ++$weekdate; } } echo'</table>'; ?> </body> </html>
ดูเพิ่มเติม
About the author