Home

Byphunsanit

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

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

  1. เมื่อกำหนดวันมาให้ สมมุติวันที่ 5 สิงหาคม 2555 จะต้องแสดงวันที่ให้ตรงกับวันที่จริงๆ วันถ้าเป็นวันศุกร์ก็ต้องแสดงให้ตรงกับสดมภ์ของวันศุกร์ (ถ้าบอกว่าให้ช่องแรกเป็นวันศุกร์ไปเลย เขียนง่ายดี ก็ได้ แต่จะอ่านยากมาก)
  2. ต้องแสดงอาทิตย์ที่ผ่านมา และอาทิตย์ถัดไป (อาจจะหลายเดือน) ให้สัมพันธ์กับวันที่ในข้อ 1 ถ้าได้ข้อแรกแล้ว สามารถดัดแปลงเอามาใช้ได้
  3. การแสดงเป็นรูปแบบปฏิทิน
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<!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>

ดูเพิ่มเติม