2011-01-30 40 views
0

我需要一個快速的方式來驗證在PHP或JavaScript是否日期是無效的日期,如(2/31或04/31 - 因爲他們不存在),隨着如果它是否是LEAP年。驗證使用PHP或Javascript的具體日期

我的代碼:

<?php 
$month = $_POST["mo"]; 
$day = $_POST["theDay"]; 
$yr = $_POST["year"]; 
if (!isset($_POST['submit'])) { // if page is not submitted; echo form 
?> 

<h2 style="margin:0; padding:0;">Date Selection</h2> 
    <span style="color:gray; font-size:0.8em;">By Joseph Dickinson</span> 
<FORM method="POST" action="<?php echo $PHP_SELF;?>"> 
    <select name="mo"> 
     <option disabled="disabled">SELECT MONTH</option> 
     <option>January</option> 
     <option>February</option> 
     <option>March</option> 
     <option>April</option> 
     <option>May</option> 
     <option>June</option> 
     <option>July</option> 
     <option>August</option> 
     <option>September</option> 
     <option>October</option> 
     <option>November</option> 
     <option>December</option> 
    </select> 
    <select name="theDay"> 
     <option disabled="disabled">SELECT DAY</option> 
     <option>1</option> 
     <option>2</option> 
     <option>3</option> 
     <option>4</option> 
     <option>5</option> 
     <option>6</option> 
     <option>7</option> 
     <option>8</option> 
     <option>9</option> 
     <option>10</option> 
     <option>11</option> 
     <option>12</option> 
     <option>13</option> 
     <option>14</option> 
     <option>15</option> 
     <option>16</option> 
     <option>17</option> 
     <option>18</option> 
     <option>19</option> 
     <option>20</option> 
     <option>21</option> 
     <option>22</option> 
     <option>23</option> 
     <option>24</option> 
     <option>25</option> 
     <option>26</option> 
     <option>27</option> 
     <option>28</option> 
     <option>29</option> 
     <option>30</option> 
     <option>31</option> 
    </select> 

    <select name="year"> 
     <option disabled="disabled">SELECT YEAR</option> 
     <option>2011</option> 
     <option>2010</option> 
     <option>2009</option> 
     <option>2008</option> 
     <option>2007</option> 
     <option>2006</option> 
     <option>2005</option> 
     <option>2004</option> 
     <option>2003</option> 
     <option>2002</option> 
     <option>2001</option> 
     <option>2000</option> 
     <option>1999</option> 
     <option>1998</option> 
     <option>1997</option> 
     <option>1996</option> 
     <option>1995</option> 
     <option>1994</option> 
     <option>1993</option> 
     <option>1992</option> 
     <option>1991</option> 
     <option>1990</option> 
     <option>1989</option> 
     <option>1988</option> 
     <option>1987</option> 
     <option>1986</option> 
     <option>1985</option> 
     <option>1984</option> 
     <option>1983</option> 
     <option>1982</option> 
     <option>1981</option> 
     <option>1982</option> 
    </select> 
<INPUT TYPE="submit" value="Send" name="submit" /> 
</FORM> 
<? 
} else { 
echo "You chose: " . " ". $month . " ".$day . ", ". $yr; 
} 
?> 

如果有人能在這裏幫助我。

+1

在客戶端和服務器端進行檢查肯定會更好。你使用JavaScript庫嗎? – 2011-01-31 00:09:43

回答

0

當您創建日期過高的月份mktime()的時間戳時,它會跳到下一個月,並顯示差異的日期。例如,2月31日產生3月3日。因此,爲了確保它是有效的,只需創建時間,然後重新檢查月份是否已更改。

$month = 2; 
$date = 31; 
$year = 2011; 
$time = mktime(1, 0, 0, $month, $date, $year); 
if (date('n', $time) != $month) { 
    // invalid error! 
} 

相同的機制也自動佔閏年。但是如果你想知道這是不是閏年,只需查詢date('L', $time);即可。

http://php.net/date

http://php.net/mktime

作爲一個側面說明,如果你使用Javascript驗證它,還必須用PHP檢查。永遠不要依靠客戶端驗證。

+0

我的代碼存在問題: – Jshee 2011-01-31 00:40:58

+0

@jaydee:有什麼問題? – Jonah 2011-01-31 02:25:19

2

首先,添加數字作爲值數月:

<select name="mo"> 
    <option disabled="disabled">SELECT MONTH</option> 
    <option value="1">January</option> 
    <option value="2">February</option> 
    <option value="3">March</option> 
    <option value="4">April</option> 
    <option value="5">May</option> 
    <option value="6">June</option> 
    <option value="7">July</option> 
    <option value="8">August</option> 
    <option value="9">September</option> 
    <option value="10">October</option> 
    <option value="11">November</option> 
    <option value="12">December</option> 
</select> 

然後使用checkdate()

<?php 

$month = $_POST["mo"]; 
$day = $_POST["theDay"]; 
$yr = $_POST["year"]; 
if (checkdate($month, $day, $yr) !== true) { 
    // ? 
} 

?> 

如果你想這樣做的瀏覽器爲好,先添加一個onsubmit處理到年份表格:

<FORM method="POST" action="<?php echo $PHP_SELF;?>" onsubmit="return checkLeap(this);"> 

然後你的功能:

function checkLeap(form) { 
    var month = form.mo.options[form.mo.selectedIndex].value; 
    var day = form.theDay.options[form.theDay.selectedIndex].value; 
    var year = form.year.options[form.year.selectedIndex].value; 
    if (month == 2 && day == 29 && (new Date(year,month,year).getDate() != 29)) { 
     alert('That is not a leap year. Please fix.'); 
     return false; 
    } 
    return true; 
}