หา วัน เดือน ปี สำหรับ LeapYear (ปีอธิกสุรธิน) PHP


หน้าแรก PHP MySQL เกร็ดความรู้ หา วัน เดือน ปี สำหรับ LeapYear (ปีอธิกสุรธิน) PHP
วิธีการหา ปีอธิกสุรธิน LeapYear
หลักการทำงานของมันคำนวน ปีอธิกสุรทิน ไปตามรอบทุกๆสี่ปี หรือปีหนึ่งมี 365.25 วัน แต่ว่าในความเป็นจริง แล้ว การโคจรรอบดวงอาทิตย์ในหนึ่งรอบ กินเวลา จริงๆ = 365.25636 หรือคลาดเคลื่อนไปจากความเป็นจริง = 0.00636 วันต่อปี

ดังนั้น การกำหนดปีอธิกสุรทิน นั้นจึงมีข้อกำหนดและข้อยกเว้น+ไม่ได้มีทุกสี่ปีอย่างที่เข้าใจ แต่การกำหนดปีอธิกสุรทิน มีหลักดังนี้

การคำนวนหาปีอธิกสุรทิน ให้คิดปี ตามปี ค.ศ.

กำหนดให้ปีทั่วไป ให้มี 365 วัน (เดือนกพ. 28 วัน)แต่ปีที่หารด้วย สี่ลงตัว เป็นปี อธิกรสุรทิน มี 366 วัน (เดือนกพ.มี 29 วัน)เช่น 1992 ,1996 เป็นต้น

ข้อยกเว้นที่ 1 ถ้าปีที่หารด้วย 4 ลงตัว แต่ ถ้าปีนั้นหารด้วย 100 ลงตัวด้วย ก็ไม่นับเป็นปี อธิกสุรธิน (กพ.มี 28 วัน) เช่นปี 1400,1500,1700,1800 เป็นต้น

ข้อยกเว้นที่ 2 ถ้าปีนั้นหารด้วย100 ลงตัว แต่ว่าหารด้วย 400 ลงตัว ก็ให้นับเป็น ปีอธิกสุรทิน (กพ.มี 29 วัน )เช่นปี 400,800,1200,1600 และปี 2000 ที่เพิ่งผ่านมาเป็นต้น

เพราะฉะนั้นในรอบ 400 ปี จะมีจำนวนวันทั้งสิ้น 365x400 + 100 - 4 + 1 = 146097 วัน หรือเฉลี่ยแล้วปฏิทินแบบนี้จะมี 365.2425 วันต่อปี ซึ่งคลาดเคลื่อนจากกำหนดปีจริงแค่ 0.001386 วันต่อปี ดีกว่าการคิดแบบ สี่ปีครั้งธรรมดา แต่ก็ยังมีความคลาดเคลื่อนอยู่บ้างดังนั้นนานๆครั้งก็จะต้องมีการปรับปฏิทินกันซักที แต่ว่ากว่าจะปรับก็คงหลายหมื่นปีนั่นแหละ

การเขียนโปรแกรม
//Leap year if (year mod 4 == 0) and ((year mod 100 != 0) or (year mod 400 == 0)) { use 29 for days in February } else { use 28 for days in February } 

Source Code
<script language="javascript">
function MM_jumpMenu(targ,selObj,restore){ //v3.0
  eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
  if (restore) selObj.selectedIndex=0;
}
//-->
</script>


<table width="300">
  <tr> 
    <td> 
      <? 

$swcSYear=2010; //ปีที่เริ่ม
$swcYear=2020;//ปีที่สิ้นสุด

echo "<form name="form4" style="margin:0px;">
<select name="menu4" onChange="MM_jumpMenu('parent',this,0)">
<option value="?">ปี</option>n";
//if($s_y=="") { $s_y=date("Y");}
for($b_d=$swcSYear;$b_d<=$swcYear;$b_d++){ 
if(strlen($b_d)<2) { $b_d="0".$b_d;}
echo "<option value='?s_y=$b_d' "; if($s_y=="$b_d") { echo " selected ";} echo">$b_d</option>n";}
echo "</select></form>";
?>
    </td>
    <td> 
      <? 
echo "<form name="form5" style="margin:0px;">
<select name="menu5" onChange="MM_jumpMenu('parent',this,0)">";
echo "<option value='?s_y=$s_y'>เดือน</option>n";
//if($s_m=="") { $s_m=date("m");}
for($b_d=1;$b_d<13;$b_d++){ 
if(strlen($b_d)<2) { $b_d="0".$b_d;}
echo "<option value="?s_y=$s_y&s_m=$b_d" ";  if($s_m=="$b_d") { echo " selected";} echo">$b_d</option>n";}
echo "</select></form>";
?>
    </td>
    <td> 

      <? 
echo "<form name="form7" style="margin:0px;">
<select name="menu7" onChange="MM_jumpMenu('parent',this,0)">";
echo "<option value='?s_y=$s_y&s_m=$s_m'>วันที่</option>n";
if($s_m=="") { $s_m=date("m");}
if(($s_m==1)||($s_m==3)||($s_m==5)||($s_m==7)||($s_m==8)||($s_m==10)||($s_m==12)) { $s_ms=32; }
else if(($s_m==4)||($s_m==6)||($s_m==9)||($s_m==11)) { $s_ms=31; }
else {
//Leap year if (year mod 4 == 0) and ((year mod 100 != 0) or (year mod 400 == 0)) { use 29 for days in February } else { use 28 for days in February } 
if((($s_y%4)==0)&&(($s_y%100!=0)||($s_y%400==0))) { $s_ms=30; }
else { $s_ms=29; }
}

//if($s_d=="") { $s_d=date("d");}
for($b_d=1;$b_d<$s_ms;$b_d++){ 
if(strlen($b_d)<2) { $b_d="0".$b_d;}
echo "<option value="?s_y=$s_y&s_m=$s_m&s_d=$b_d" ";  
if($s_d=="$b_d") { echo " selected";} echo">$b_d</option>n";}
echo "</select></form>";
?>
    </td>
    <td>(ปี-เดือน-วัน)</td>
  </tr>
</table>


ขึ้นไปด้านบน