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