โจทย์คือ สร้างปฏิทินสำหรับวางแผนงานต่างๆ โดยจะมีลักษณะแตกต่างจาก ที่ใช้ตามปกติคือ แทนที่จะแบ่งเป็นเดือนๆ จะยาวต่อกัน บางครั้งอาจมีความยาวหลายๆ เดือนติดกัน
ความยากคือ
- เมื่อกำหนดวันมาให้ สมมุติวันที่ 5 สิงหาคม 2555 จะต้องแสดงวันที่ให้ตรงกับวันที่จริงๆ วันถ้าเป็นวันศุกร์ก็ต้องแสดงให้ตรงกับสดมภ์ของวันศุกร์ (ถ้าบอกว่าให้ช่องแรกเป็นวันศุกร์ไปเลย เขียนง่ายดี ก็ได้ แต่จะอ่านยากมาก)
- ต้องแสดงอาทิตย์ที่ผ่านมา และอาทิตย์ถัดไป (อาจจะหลายเดือน) ให้สัมพันธ์กับวันที่ในข้อ 1 ถ้าได้ข้อแรกแล้ว สามารถดัดแปลงเอามาใช้ได้
- การแสดงเป็นรูปแบบปฏิทิน
[sourcecode language=”PHP”]
<!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>
[/sourcecode]
ดูเพิ่มเติม
About the author