โจทย์คือ สร้างปฏิทินสำหรับวางแผนงานต่าง ๆ โดยจะมีลักษณะแตกต่างจาก ที่ใช้ตามปกติคือ แทนที่จะแบ่งเป็นเดือน ๆ จะยาวต่อกัน บางครั้งอาจมีความยาวหลาย ๆ เดือนติดกัน
ความยากคือ
- เมื่อกำหนดวันมาให้ สมมุติวันที่ 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>
ดูเพิ่มเติม