Tag Archive calendar

Byphunsanit

สร้างปฏิทินวางแผนปฏิบัติงานโดย PHP

โจทย์คือ สร้างปฏิทินสำหรับวางแผนงานต่างๆ โดยจะมีลักษณะแตกต่างจาก ที่ใช้ตามปกติคือ แทนที่จะแบ่งเป็นเดือนๆ จะยาวต่อกัน บางครั้งอาจมีความยาวหลายๆ เดือนติดกัน
ความยากคือ

  1. เมื่อกำหนดวันมาให้ สมมุติวันที่ 5 สิงหาคม 2555 จะต้องแสดงวันที่ให้ตรงกับวันที่จริงๆ วันถ้าเป็นวันศุกร์ก็ต้องแสดงให้ตรงกับสดมภ์ของวันศุกร์ (ถ้าบอกว่าให้ช่องแรกเป็นวันศุกร์ไปเลย เขียนง่ายดี ก็ได้ แต่จะอ่านยากมาก)
  2. ต้องแสดงอาทิตย์ที่ผ่านมา และอาทิตย์ถัดไป (อาจจะหลายเดือน) ให้สัมพันธ์กับวันที่ในข้อ 1 ถ้าได้ข้อแรกแล้ว สามารถดัดแปลงเอามาใช้ได้
  3. การแสดงเป็นรูปแบบปฏิทิน
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title> PlusMagic&#039;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>

ดูเพิ่มเติม