验证无效日期/闰年

时间:2011-01-31 15:47:33

标签: jquery

尝试使用jquery执行此操作,我找到了一个名为“真实日期验证”的插件。我似乎无法正确实现它。

任何人都可以帮助我吗?试图验证日期2-31- [whateveryee]不应该工作,以及闰年......

<?php 
$month = $_POST["mo"];
$day = $_POST["theDay"];
$yr = $_POST["year"];
if (!isset($_POST['submit'])) { // if page is not submitted; echo form
?>
<script type="text/javascript" src="jquery.js"> </script>
<script type="text">
 $(document).ready(function() {
  var month = $('#mo').val();
  var day = $('#tDay').val();
  var year = $('#tYear').val();
  var date = new Date(month+"/"+day+"/"+year);

  if(day == "29" && month == "02") {
  if(year % 4 == 0 && ( year % 100 != 0 || year % 400 == 0)) {
  return true
  } else { return false; }
  } else if(month == (date.getMonth()+1) && day == date.getDate() && year == date.getFullYear()) {
  return true;
  } else { return false; }
});
</script>




<h2 style="margin:0; padding:0;">Date Selection</h2>
<FORM method="POST" action="<?php echo $PHP_SELF;?>"> 
 <select name="mo" id="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" id="tDay">
   <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" id="tYear">
   <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;
}
?>

3 个答案:

答案 0 :(得分:4)

无需亲自检查。 JavaScript Date对象将为您执行此操作。创建对象后,只需将属性与原始值进行比较:

我将它放在一个单独的函数中,因为从ready函数返回一个值是没有意义的:

function validateDate() {
  var month = +$('#mo').val() - 1; // Convert to numbers with "+" prefix
  var day = +$('#tDay').val();
  var year = +$('#tYear').val();
  var date = new Date(year, month, day); // Use the proper constructor

  return date.getFullYear() == year && date.getMonth() == month && date.getDate() == day;
}

答案 1 :(得分:0)

为什么不用PHP来做呢?

<?php 
if( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
    $day   = $_POST["theDay"];
    $month = $_POST["mo"];
    $year  = $_POST["year"];

    if( checkdate( $month, $day, $year ) )
    {
        echo 'Congratulations, you managed to enter a date that exists';
    }
}
?>

答案 2 :(得分:0)

以防万一。

使用ISO(yyyy-mm-dd)日期格式,jQuery接受无效的日期,其中月份少于31天(2020-06-31),并且不处理leap年。 这是我扩展日期验证器的解决方案。

$.validator.methods.date = function (value, element) {
    if (value) {
        if (!jQuery.validator.methods.dateISO.call(this, value, element))
            return false;
        var jsDate = new Date(value);
        if (jsDate == "Invalid Date")
            return false;
        if (jsDate.toISOString().substring(0, 10) != value)
            return false;
    }
    return true;
}