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

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

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

ดูแล้ว 6,446 ครั้ง




เนื้อหาตอนต่อไปนี้จะมาแนะนำแนวทางฟังก์ชั่น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
  • ปีอธิกวาร จากข้อมูลสุดท้ายแล้ว
 
1
$arr_atikawan_y = [2500,2506,2513,2516,2522,2530,2533,2540,2543,2549,2552,2559,2563,2568,2575,2578,2586,2589,2595];

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

 
การหาวันข้างขึ้น ข้างแรม เป็นการวนลูปข้อมูล วันเริ่มต้น แล้วสร้างปฏิทินขึ้นมา ดังนั้น ถ้าเราจะหาข้อมูลของปี 2021 เราก็ต้องวนลูปปีตั้งแต่ 1957 (2500) มาจนถึง 2021 (2564)
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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 ของปีถัดไป จากการบวกจำนวนวันของปีนั้นๆ
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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 ปีปฏิทิน ตามเงื่อนไข
 
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
<?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


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

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<?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


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


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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
<?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


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

 
เดิมในบทความ เราจะสามารถหาได้เฉพาะว่าปีใดเป็นปีอธิกมาสเท่านั้น ส่วนปีอธิกวาร เราใช้วิธี
กำหนดปีจากข้อมูลสุดท้าย ซึ่งจะไม่ค่อยยืนหยุ่นเท่าไหร่ และในตอนนี้เราสามารถสร้างฟังก์ชั่น
สำหรับหาได้ทั้งปีอธิกมาส และปีอธิการในฟังก์ชั่นได้ ก็สามารถนำมาปรับใช้งานได้ง่าย ดังน้
เพิ่มฟังก์ชั่นี้เข้าไป
 
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
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];
}
 
จากนั้นแก้ไขบรรทัดสองบรรทัดนี้ เป็นค่าใหม่ ตามตัวอย่างด้านล่าง
 
1
2
3
4
// $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 สำหรับอ้างอิง











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