แนวทางฟังก์ชั่น php อย่างง่ายกับการหาวันข้างขึ้นข้างแรม

เขียนเมื่อ 2 ปีก่อน โดย Ninenik Narkdee
ปฏิทินไทย วันข้างขึ้นข้างแรม

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ ปฏิทินไทย วันข้างขึ้นข้างแรม



เนื้อหาตอนต่อไปนี้จะมาแนะนำแนวทางฟังก์ชั่นphp อย่างง่าย
สำหรับใช้ในการหาข้างขึ้นข้างแรมโดยจะประยุกต์สำหรับปี พ.ศ. 2500 - พ.ศ. 2600
 
เราไม่สามารถหาวันข้างขึ้น หรือวันข้างแรม จากปฏิทินปกติได้ สำหรับการหาวันข้างขึ้น วันข้างแรม เราจำเป็นต้องใช้ปฏิทินจันทรคติไทย ซึ่งสามารถนับวันสำคัญทางพุทธศาสนา และวันข้างขึ้นข้างแรมได้ สามารถค้นหาที่มาที่ไป และความหมายของปฏิทินจันทรคดิไทยได้เพิ่มเติม
 

ปีปฏิทินไทย

ปีปฏิทินไทย จะแบ่งออกได้เป็น 3 แบบ คือ
  • แบบปกติ มี 12 เดือน
  • ปีอธิกมาส มี 13 เดือน มีเดือนพิเศษแทรก ระหว่างเดือน 7 กับ เดือน 8 เรียกว่า เดือน 8 หนแรก เพิ่ม 30 วัน
  • ปีอธิกวาร มี 12 เดือน แต่มีวัน แรม 15 ค่ำ เดือน 7 เพิ่มเข้ามา 1 วัน
 

จำนวนวันของปีแต่ละแบบในปฏิทินไทย

การนับปีทางจันทรคติ นับตามเวลาการโคจรของดวงจันทร์รอบโลก 1 รอบ ใช้เวลา 29 วัน ครึ่ง ถ้านับ 29 วัน  ก็จะขาดไป 12 ชั่วโมง ดังนั้น จึงนับ 2 เดือนเป็น 59 วัน โดยเริ่มนับเดือนคี่ให้มี 29 วัน และเดือนคู่ ให้มี 30 วัน สลับไปจนครบ 12 เดือน ก็จะได้วันของปีปกติเท่ากับ 59 * 6 เท่ากับ 354 วัน ดังนั้น ปีแต่ละแบบ ก็จะมีจำนวนวันเป็นดังนี้คือ
  • ปีปกติ มี 12 เดือน มี 354 วัน
  • ปีอธิกมาส มี 13 เดือน มีเพิ่ม 1 เดือน 30 วัน ก็จะมีวันทั้งหมด 384 วัน
  • ปีอธิวาร มี 12 เดือน แต่มีวันเพิ่มมา 1 วันในเดือน 7 ก็จะมีวันทั้งหมด 355 วัน
 
 

วิธีการหาปีอธิกมาส ปีอธิกวาร

    สำหรับวิธีการคำนวณหาปีอธิกมาส ปีอธิกวาร ในที่นี้ผู้เขียนได้แนวทางจากยูทูปช่อง Loy Academy
  เกี่ยวกับเรื่องปฏิทินไทย แต่ก็ไม่สามารถเข้าใจเนื้อหาทั้งหมด จึงได้มาแค่สูตรการหาปีที่เป็นปี อธิกมาส หรือปีที่มีเดือน 8 สองหน อย่างไรก็ตาม ถ้าใครสามารถทำการแปลงหรือประยุกต์หาปีอธิกวารได้ ก็สามารถปรับประยุกต์เพิ่มเติมได้ ในที่นี้จะใช้ปี อธิกวาร จากค่าที่มีอยู่แล้ว หรือค่าที่ได้จากการคำนวณมาแล้ว จากแหล่งข้อมูลอื่นมาใช้
 

วิธีการหาวันข้างขึ้นข้างแรม

    ในแต่ละเดือนจะมีข้างขึ้น และข้างแรม ในรูปแบบดังนี้คือ ในทุกเดือน จะมี ข้างขึ้น 1 ค่ำ ถึง 15 ค่ำ  ส่วนข้างแรม เดือนคี่จะมี ถึงแค่ แรม 14 ค่ำ ส่วนเดือนคู่ จะมีถึงแรม 15 ค่ำ แต่ก็มีเงื่อนไข ตามปี ที่ได้กล่าวมาตอนต้น เพราะมีวันเพิ่มขึ้น แต่รูปแบบการเปลี่ยนแปลงก็ไม่ได้เปลี่ยนไปมากนัก คือ ปีอธิวาร เดือน 7 เป็นเดือนคี่ แต่จะมีแรม 15 ค่ำด้วย นอกนั้นก็ยืดตามเดือนคี่ เดือนคู่ปกติ
    การนับเริ่มปฏิทินไทย จะเริ่มนับตั้งแต่วัน ขึ้น 1 ค่ำเดือน 1 หรือที่เรียกว่า เดือนอ้าย ซึ่งก็แสดงว่า เป็นวันหลังจากวัน แรม 15 ค่ำ เดือน 12 การที่เราจะสร้างปฏิทิน เพื่อหาวันข้างขึ้นข้างแรม จึงจำเป็นต้องมีวันเริ่มต้นก่อน เมื่อเราย้อนปฏิทินเก่า เพื่อดูวันขึ้น 1 ค่ำ เดือน 1 ของปี 2500 ก็จะได้เป็นวันที่
 
3 ธันวาคม 2499 หรือในรูปแบบมาตรฐานคือ 1956-12-03
 
เราได้ข้อมูลครบ พร้อมสำหรับการหาวันข้างขึ้นข้างแรม แล้ว ได้แก่
  • วันขึ้น 1 ค่ำ เดือน 1 ของปี 2500 คือ 1956-12-03
  • ปีอธิกวาร จากข้อมูลสุดท้ายแล้ว
 
$arr_atikawan_y = [2500,2506,2513,2516,2522,2530,2533,2540,2543,2549,2552,2559,2563,2568,2575,2578,2586,2589,2595];

  • สูตรการหาปีอธิกมาส
<?php
$year = "2021";
$is_atikamas = (fmod((($year - 78) - 0.45222),2.7118886)<1)?1:0;
echo $is_atikamas; // เท่ากับ 1 เป็นปี อธิกมาส
?>

 
การหาวันข้างขึ้น ข้างแรม เป็นการวนลูปข้อมูล วันเริ่มต้น แล้วสร้างปฏิทินขึ้นมา ดังนั้น ถ้าเราจะหาข้อมูลของปี 2021 เราก็ต้องวนลูปปีตั้งแต่ 1957 (2500) มาจนถึง 2021 (2564)
 
<?php
$_begin_thai_date = "1956-12-03";
$arr_atikawan_y = [2500,2506,2513,2516,2522,2530,2533,2540,2543,2549,2552,2559,2563,2568,2575,2578,2586,2589,2595];
$_begin_year = 1957;
$_check_year = 2021; // ปีที่จะหาข้อมูล
for($i = $_begin_year; $i <= $_check_year; $i++){
    $is_atikamas = (fmod((($i - 78) - 0.45222),2.7118886)<1)?1:0;
    $is_atikawan = (in_array(($i+543),$arr_atikawan_y))?1:0;
    $day_in_year = 354;
    $day_in_year = ($is_atikamas==1)?384:$day_in_year;
    $day_in_year = ($is_atikawan==1)?355:$day_in_year;
    
    echo $i." - ".$day_in_year."<br>";
}
?>

 
 
คำสั่งนี้เราจะได้รูปแบบผลลัพธ์ เป็นปี ค.ศ. และ จำนวนวันในปีนั้น ตัวอย่าง 3 ปีสุดท้าย
 
2019 - 354
2020 - 355
2021 - 384

 
ต่อไป เมื่อเรารู้วันขึ้น 1 ค่ำ เดือน 1 เริ่มต้น เราก็สามารถ หาวันขึ้น 1 คำ เดือน 1 ของปีถัดไป จากการบวกจำนวนวันของปีนั้นๆ
 
<?php
$_begin_thai_date = "1956-12-03";
$arr_atikawan_y = [2500,2506,2513,2516,2522,2530,2533,2540,2543,2549,2552,2559,2563,2568,2575,2578,2586,2589,2595];
$_begin_year = 1957;
$_check_year = 2021; // ปีที่จะหาข้อมูล
$day_add = 0; // วันที่เพิ่มแต่ละปี
for($i = $_begin_year; $i <= $_check_year; $i++){
    $is_atikamas = (fmod((($i - 78) - 0.45222),2.7118886)<1)?1:0;
    $is_atikawan = (in_array(($i+543),$arr_atikawan_y))?1:0;
    $day_in_year = 354;
    $day_in_year = ($is_atikamas==1)?384:$day_in_year;
    $day_in_year = ($is_atikawan==1)?355:$day_in_year;
    
    // วันขึ้น 1 ค่ำ เดือน 1 ของแต่ละปี
    $begin_buddhist_day_of_year = date("Y-m-d",strtotime($_begin_thai_date." +$day_add day")); // 
    $day_add+= $day_in_year; // เพิ่มวันแต่ละปี
    echo $i." - ".$day_in_year." - ".$begin_buddhist_day_of_year."<br>";
}
?>

 
คำสั่งนี้จะได้ผลลัพธ์ วันขึ้น 1 เดือน 1 ของปีนั้นๆ ตัวอย่าง 3 ปีล่าสุด
 
2019 - 354 - 2018-12-08
2020 - 355 - 2019-11-27
2021 - 384 - 2020-11-16

 
จะเห็นว่าเดือน 1 ของปฏิทินไทย จะเป็นของปีก่อนหน้า
 
ต่อไปก็เป็นขั้นตอนการวนลูปวันของแต่ละเดือน สร้างวันขึ้น วันแรมของเดือนนั้นๆ ใน 1 ปีปฏิทิน ตามเงื่อนไข
 
<?php
$_begin_thai_date = "1956-12-03";
$arr_atikawan_y = [2500,2506,2513,2516,2522,2530,2533,2540,2543,2549,2552,2559,2563,2568,2575,2578,2586,2589,2595];
$_begin_year = 1957;
$_check_year = 2021; // ปีที่จะหาข้อมูล
$day_add = 0; // วันที่เพิ่มแต่ละปี
for($i = $_begin_year; $i <= $_check_year; $i++){
    $is_atikamas = (fmod((($i - 78) - 0.45222),2.7118886)<1)?1:0;
    $is_atikawan = (in_array(($i+543),$arr_atikawan_y))?1:0;
    $day_in_year = 354;
    $day_in_year = ($is_atikamas==1)?384:$day_in_year;
    $day_in_year = ($is_atikawan==1)?355:$day_in_year;
    
    // วันขึ้น 1 ค่ำ เดือน 1 ของแต่ละปี
    $begin_buddhist_day_of_year = date("Y-m-d",strtotime($_begin_thai_date." +$day_add day")); // 
    $day_add+= $day_in_year; // เพิ่มวันแต่ละปี
    // echo $i." - ".$day_in_year." - ".$begin_buddhist_day_of_year."<br>";
    $c_day = 0; // นับวัน
    $c_month = 0; // นับเดือน
    $c_u_day = 0; // นับวันขึ้น
    $c_d_day = 0; // นับวันแรม   
    $current_month = 1; // เดือนเริ่มต้น
    $day_in_month = 0; // วันในแต่ละเดือน
    $month_in_year = 12; // เดือนใน 1 ปี
    $double_month = false; // เดือน 8 สองหนหรือไม่
    $month_in_year = ($is_atikamas==1)?13:$month_in_year; // มี 13 เดือน
    if($i==$_check_year){ // วนลูปเฉพาะปีที่จะดู
        for($v = 0; $v < ($day_in_year+60); $v++){ // วนลุป วันในปีนั้นๆ +เพิ่มวันเพื่อให้ข้ามปี
            $c_day++;
            $final_d_day = ($current_month%2==1)?14:15;
            $final_d_day = ($is_atikawan==1 && $current_month==7)?15:$final_d_day;
            if($c_d_day==$final_d_day){ // ถึงวันแรมสุดท้ายของเดือน เริ่มเดือนใหม่
                $current_month++;
                if($current_month==13){ // เข้าปีปฏิทินไทยใหม่ นับเดือนใหม่
                    $current_month = 1;
                }
                // ปีที่มีแปด 2 หน
                if($is_atikamas && $current_month==9 && $double_month==false){
                    $current_month--;
                    $double_month = true;
                }
                $c_u_day = 0;
                $c_d_day = 0;
            }        
            if($c_u_day<15){ // นับวันข้างขึ้น
                $c_u_day++;
            }else{         
                if($c_d_day<$final_d_day){ // นับวันข้างแรม
                    $c_d_day++;
                }
            }
            // แสดงวันที่ในปฏิทิน
            echo date("Y-m-d",strtotime($begin_buddhist_day_of_year."+ $v day"))." - ";
            // แสดงวันข้างขื้น หรือข้างแรม
            if($c_d_day>0){
                echo "แรม $c_d_day ค่ำ เดือน $current_month "."<br>";
            }else{
                echo "ขึ้น $c_u_day ค่ำ เดือน $current_month "."<br>";
            }
        } 
    }
}
?>

 
ในตัวอย่าง เราหาข้อมูลของปี 2021 จะได้ผลลัพธ์ ตัวอย่าง ดังนี้
 
2021-11-30 - แรม 11 ค่ำ เดือน 12
2021-12-01 - แรม 12 ค่ำ เดือน 12
2021-12-02 - แรม 13 ค่ำ เดือน 12
2021-12-03 - แรม 14 ค่ำ เดือน 12
2021-12-04 - แรม 15 ค่ำ เดือน 12
2021-12-05 - ขึ้น 1 ค่ำ เดือน 1
2021-12-06 - ขึ้น 2 ค่ำ เดือน 1
2021-12-07 - ขึ้น 3 ค่ำ เดือน 1
2021-12-08 - ขึ้น 4 ค่ำ เดือน 1

 
ข้อมูลตัวอย่างผลลัพธ์จริงจะแสดงกว่า 300 วัน
 
แนวทางเบื้องต้นนี้ ทำให้เราสามารถหาวันข้างขึ้น ข้างแรม ในแต่ละปีได้ วันข้างขึ้นวันข้างแรม บอกอะไรเราได้บ้าง
  • เราสามารถหาปีนักษัตรไทย ได้
  • เราสามารถหาวันพระเล็ก วันพระใหญ่ได้
  • เราสามารถหาวันสำคัญทางพระพุทธศาสนา ว่าตรงกับวันไหนได้
 
แนวทางการประยุกต์เพิ่มเติม มีโอกาสจะมานำเสนอต่อไป


กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ







เนื้อหาที่เกี่ยวข้อง









URL สำหรับอ้างอิง











เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ