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

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

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

ดูแล้ว 4,799 ครั้ง




เนื้อหาตอนต่อไปนี้จะมาแนะนำแนวทางฟังก์ชั่น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 วัน
 
แนวทางเบื้องต้นนี้ ทำให้เราสามารถหาวันข้างขึ้น ข้างแรม ในแต่ละปีได้ วันข้างขึ้นวันข้างแรม บอกอะไรเราได้บ้าง
  • เราสามารถหาปีนักษัตรไทย ได้
  • เราสามารถหาวันพระเล็ก วันพระใหญ่ได้
  • เราสามารถหาวันสำคัญทางพระพุทธศาสนา ว่าตรงกับวันไหนได้
 
แนวทางการประยุกต์เพิ่มเติม มีโอกาสจะมานำเสนอต่อไป


   เพิ่มเติมเนื้อหา ครั้งที่ 1 วันที่ 14-04-2024


ประยุกต์สร้างฟังก์ชั่นหาวันข้างขึ้นข้างแรมจากวันที่กำหนด

<?php
date_default_timezone_set('Asia/Bangkok');
function getWaxingCrescentInfo($inputDay)
{
    $show_all_day_in_year = 0;
    if(strlen($inputDay)==4 && intval($inputDay)>=1957){
        $show_all_day_in_year = 1;
        $inputDay = $inputDay."-01-01";
    }else{
        $dateTime = DateTime::createFromFormat('Y-m-d', $inputDay);
        if($dateTime !== false && !array_sum($dateTime->getLastErrors())){
    
        }else{
            return "รูปแบบวันที่ไม่ถูกต้อง";
        }
    }
    $arr_return_day = [];
    $_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 = (isset($inputDay))?date("Y",strtotime($inputDay)):date("Y"); // ปีที่จะหาข้อมูล
    $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; // นับวันแรม   
        $double_month_eight = ""; // เดือน 8 สองหนหรือไม่
        $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;
                        $double_month_eight = "หลัง";
                    }else{
                        $double_month_eight = "";
                    }
                    $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) {
                    $data_waxing_crescent = "แรม $c_d_day ค่ำ เดือน $current_month $double_month_eight ";
                } else {
                    $data_waxing_crescent = "ขึ้น $c_u_day ค่ำ เดือน $current_month $double_month_eight ";
                }
                $arr_return_day[date("Y-m-d", strtotime($begin_buddhist_day_of_year . "+ $v day"))] = $data_waxing_crescent;
            }
        }
    }

    if($show_all_day_in_year==1){
        return  $arr_return_day;      
    }else{
        $value_waxing_crescent = $arr_return_day[date("Y-m-d",strtotime($inputDay))] ?? null;
        if ($value_waxing_crescent !== null) {
            return  $value_waxing_crescent;
        } else {
            return "ไม่พบข้อมูล";
        }   
    } 

}
 
// สมมติหาวันข้างขืนข้างแรม ของวันที่ 15 เดือน 4 ปี 2024
$data = getWaxingCrescentInfo("2024-04-15"); // ระบุวันที่ที่ต้องการชัดเจน
echo "<pre>";
print_r($data); // ขึ้น 7 ค่ำ เดือน 5

// สมมติหาวันข้างขืนข้างแรม ของวันที่ 15 เดือน 4 ปี 2024
$data = getWaxingCrescentInfo("2023");  // ใส่ปีอย่างเดียว
print_r($data); // แสดงข้อมูลของปี 2023 ทั้งหมด


   เพิ่มเติมเนื้อหา ครั้งที่ 2 วันที่ 14-04-2024


ประยุกต์สร้างฟังก์ชั่นแสดงข้อมูลวันพระทั้งหมดของปีจากวันที่กำหนด


<?php
date_default_timezone_set('Asia/Bangkok');
function getWaxingCrescentInfo($inputDay, $buddistDay=false) // เพิ่มแสดงเฉพาะวันพระได้
{
    $show_all_day_in_year = 0;
    if(strlen($inputDay)==4 && intval($inputDay)>=1957){
        $show_all_day_in_year = 1;
        $inputDay = $inputDay."-01-01";
    }else{
        $dateTime = DateTime::createFromFormat('Y-m-d', $inputDay);
        if($dateTime !== false && !array_sum($dateTime->getLastErrors())){
    
        }else{
            return "รูปแบบวันที่ไม่ถูกต้อง";
        }
    }
    $arr_return_day = [];
    $arr_return_buddha_day = [];
    $_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 = (isset($inputDay))?date("Y",strtotime($inputDay)):date("Y"); // ปีที่จะหาข้อมูล
    $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; // นับวันแรม   
        $double_month_eight = ""; // เดือน 8 สองหนหรือไม่
        $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) { // วนลูปเฉพาะปีที่จะดู
            $buddha_month_day = 0; // ประเภทของวันพระ
            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;
                        $double_month_eight = "หลัง";
                    }else{
                        $double_month_eight = "";
                    }
                    $c_u_day = 0;
                    $c_d_day = 0;
                }
                if ($c_u_day < 15) { // นับวันข้างขึ้น
                    $c_u_day++;

                    if($c_u_day==8 || $c_u_day==15){
                        if($c_u_day==15){
                            $buddha_month_day = 4;
                        }else{
                            $buddha_month_day = 3;
                        }							
                    }else{
                        $buddha_month_day = 0;
                    }	                      

                } else {
                    if ($c_d_day < $final_d_day) { // นับวันข้างแรม
                        $c_d_day++;

                        if($c_d_day==8 || $c_d_day==$final_d_day){
                            if($c_d_day==$final_d_day){
                                $buddha_month_day = 2;
                            }else{
                                $buddha_month_day = 1;
                            }							
                        }else{
                            $buddha_month_day = 0;
                        }	                        

                    }
                }
                // แสดงวันที่ในปฏิทิน
               // echo date("Y-m-d", strtotime($begin_buddhist_day_of_year . "+ $v day")) . " - ";
                // แสดงวันข้างขื้น หรือข้างแรม
                if ($c_d_day > 0) {
                    $data_waxing_crescent = "แรม $c_d_day ค่ำ เดือน $current_month $double_month_eight ";
                } else {
                    $data_waxing_crescent = "ขึ้น $c_u_day ค่ำ เดือน $current_month $double_month_eight ";
                }
                $arr_return_day[date("Y-m-d", strtotime($begin_buddhist_day_of_year . "+ $v day"))] = $data_waxing_crescent;
                if($buddha_month_day>0 && $buddha_month_day<=4){
                    $arr_return_buddha_day[date("Y-m-d", strtotime($begin_buddhist_day_of_year . "+ $v day"))] = $data_waxing_crescent;
                }                
            }
        }
    }

    if($show_all_day_in_year==1){
        if(!$buddistDay){  // ไม่ใช่แสดงเฉพาะวันพระ
            return  $arr_return_day;
        }else{
            return $arr_return_buddha_day;
        }        
    }else{
        $value_waxing_crescent = $arr_return_day[date("Y-m-d",strtotime($inputDay))] ?? null;
        if ($value_waxing_crescent !== null) {
            if(!$buddistDay){ // ไม่ใช่แสดงเฉพาะวันพระ
                return  $value_waxing_crescent;
            }else{
                return $arr_return_buddha_day;
            }
        } else {
            return "ไม่พบข้อมูล";
        }   
    } 

}
 
$data = getWaxingCrescentInfo("2024-04-15",true);
echo "<pre>";
print_r($data); // แสดงเฉพาะข้อมูลที่เป็นพระ วันพระเล็ก วันพระใหญ่

ตัวอย่างผลลัพธ์
Array
(
    [2023-12-20] => ขึ้น 8 ค่ำ เดือน 1 
    [2023-12-27] => ขึ้น 15 ค่ำ เดือน 1 
    [2024-01-04] => แรม 8 ค่ำ เดือน 1 
    [2024-01-10] => แรม 14 ค่ำ เดือน 1 
    [2024-01-18] => ขึ้น 8 ค่ำ เดือน 2 
    [2024-01-25] => ขึ้น 15 ค่ำ เดือน 2 
    [2024-02-02] => แรม 8 ค่ำ เดือน 2 
........
....
...


   เพิ่มเติมเนื้อหา ครั้งที่ 3 วันที่ 15-04-2024


ใช้งานฟังก์ชั่นหาปีอธิกมาส และปีอธิการ

 
เดิมในบทความ เราจะสามารถหาได้เฉพาะว่าปีใดเป็นปีอธิกมาสเท่านั้น ส่วนปีอธิกวาร เราใช้วิธี
กำหนดปีจากข้อมูลสุดท้าย ซึ่งจะไม่ค่อยยืนหยุ่นเท่าไหร่ และในตอนนี้เราสามารถสร้างฟังก์ชั่น
สำหรับหาได้ทั้งปีอธิกมาส และปีอธิการในฟังก์ชั่นได้ ก็สามารถนำมาปรับใช้งานได้ง่าย ดังน้
เพิ่มฟังก์ชั่นี้เข้าไป
 
function is_atikamas_atikawan($year){
    $input_year = $year - 78;
    $begin_year = 1700;  // ปีมหาศักราช 1778 - 78 
    $end_year = $input_year+5;
    $begin_deviation = 0.098385;
    $i = $begin_year;
    $arr_year_modulus = [];
    $arr_year_deviation = [];
    $arr_year_type = [];
    while($i < $end_year){
        $next_year = $i + 1;
        $val_modulus = fmod(($i - 0.45222), 2.7118886);
        $val_modulus_next_year = fmod(($next_year - 0.45222), 2.7118886);
        $arr_year_modulus[$i] = $val_modulus;
        if($i == $begin_year){
            $val_deviation = $begin_deviation;
        }else{
            $check_value_1 = ($arr_year_type[$i-1] == "wan")?-0.632944:0.367056;
            $check_value_2 = ($arr_year_modulus[$i-1] < 1)?-0.102356:$check_value_1;
            $val_deviation = $arr_year_deviation[$i-1] + $check_value_2;
          //  $val_deviation 
        }
        $arr_year_deviation[$i] = $val_deviation;
        if($val_modulus < 1){
            $arr_year_type[$i] = "mas";
        }else{
            $check_value_3 = ($val_modulus_next_year < 1)?0.0169501433191599:-0.0142223099315486;
            if($val_deviation > $check_value_3){
                $arr_year_type[$i] = "wan";
            }else{
                $arr_year_type[$i] = "";
            }
        }
        $i++;
    }
    return $arr_year_type[$input_year];
}
 
จากนั้นแก้ไขบรรทัดสองบรรทัดนี้ เป็นค่าใหม่ ตามตัวอย่างด้านล่าง
 
        // $is_atikamas = (fmod((($i - 78) - 0.45222), 2.7118886) < 1) ? 1 : 0;
        // $is_atikawan = (in_array(($i + 543), $arr_atikawan_y)) ? 1 : 0;        
        $is_atikamas = (is_atikamas_atikawan($i) == 'mas' ) ? 1 : 0;
        $is_atikawan = (is_atikamas_atikawan($i) == 'wan' ) ? 1 : 0;


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







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









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





คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )







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