amor,

ผมเขียนโปรแกรมตัวหนึ่งซึ่งจำเป็นจะต้องคำณวนหาวันหยุดภายในเดือนที่ต้องการ คิดกันง่ายๆว่าหยุดเฉพาะเสาร์-อาทิตย์ วันหยุดพิเศษไม่สนใจ หลังจากที่เขียนออกมาเป็นฟังก์ชั่นแล้ว ก็คิดว่าน้องๆอีกหลายคนอาจจะจำเป็นต้องใช้ ก็เลยเอามาให้ดูกัน อีกอย่างก็เพื่อเป็นแนวทางในการประยุกต์ใช้คำสั่ง PHP

สิ่งที่ท่านจะได้เรียนรู้ในฟังก์ชั่นที่ผมเขียนขึ้นนี้คือ

1.วิธีตรวจสอบว่าวันนั้นๆเป็นวันเสาร์หรือเปล่า

2.วิธีตรวจสอบว่าวันนั้นๆเป็นวันอาทิตย์หรือเปล่า

3. วิธีแปลงวัน ที่เป็นตัวหนังสือให้เป็นตัวเลข เพื่อง่ายต่อการเปรียบเทียบ วันสองวัน

4.จะได้รู้ว่าแท้จริงแล้วการเขียนโปรแกรมนั้นง่ายนิดเดียว

ได้ประโยชน์ถึง 4 ข้อผมว่ามันก็ควรค่าแก่การดูฟังก์ชั่นนี้แล้วล่ะ

 
function WorkingDays($year, $month, $day) {
    if (!$year)
        $year = date('Y');
    if (!$month)
        $month = date('m');
    if (!$day)
        $day = date('d');
 
    //create a start and an end datetime
    $startdate = strtotime($year . '-' . $month . '-01');
    $enddate = strtotime($year . '-' . $month . '-' . $day);
    $currentdate = $startdate;
 
    while ($currentdate <= $enddate) {
        //if not Saturday or Sunday, +1
        if (!((date('D', $currentdate) == 'Sat') || (date('D', $currentdate) == 'Sun') )) {
            $return = $return + 1;
        }
        $currentdate = strtotime('+1 day', $currentdate);
    } //end date walk loop
    //return the number of working days
    return $return;
}
 
//เรียกใช้งาน
echo WorkingDays(2011,4,30);

ตอนแรกทำการตรวจสอบว่าได้ส่งวันเดือนปีเข้ามาในฟังก์ชั่นหรือเปล่า ถ้าไม่ได้ส่งเข้ามาก็ให้ดีฟอลต์ไว้ที่วันปัจจุบัน

    if (!$year)
        $year = date('Y');
    if (!$month)
        $month = date('m');
    if (!$day)
        $day = date('d');

หาวันแรกของเดือน ซึ่งมันจะเป็นวันที่ 1 เสมอ กำหนดให้เป็นตัวเลขวินาที (เพื่อที่จะนำไปเปรียบเทียบกันได้ง่ายๆ) และหาวันสิ้นสุด

    $startdate = strtotime($year . '-' . $month . '-01');
    $enddate = strtotime($year . '-' . $month . '-' . $day);

วนลูปจากวันแรกจนไปถึงวันสุดท้าย ภายในลูปทำการตรวจสอบว่าเป็นวันเสาร์-อาทิตย์หรือไม่ ถ้าไม่ใช่ก็ให้ +วันทำงานเข้าไปอีก 1

    while ($currentdate <= $enddate) {
        //if not Saturday or Sunday, +1
        if (!((date('D', $currentdate) == 'Sat') || (date('D', $currentdate) == 'Sun') )) {
            $return = $return + 1;
        }
        $currentdate = strtotime('+1 day', $currentdate);
    } //end date walk loop

เพียงเท่านี้หลังจากโปรแกรมหลุดออกจากลูปเราก็จะได้จำนวนของวันทำงานแล้ว ง่ายๆใช่มั้ยครับ

คำสั่ง date() ที่ส่ง D เข้าไปมันจะคืนค่าชื่อวันออกมา ชื่อสามตัวแรกนะครับ เพียงเท่านี้เราก็รู้แล้วว่ามันเป็นวันอะไร

date('D', $currentdate)