หมวดหมู่: PHP

สร้างปฏิทินวางแผนปฏิบัติงานโดย PHPสร้างปฏิทินวางแผนปฏิบัติงานโดย 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>

ดูเพิ่มเติม