2016-07-25 15 views
5

私は日、月、年の3つの入力を持っています。有効日を日、月、年で確認

  • 年提示する4つの文字(すなわち、YYYY)
  • 年は1900年の間でなければなりません持っている必要があり

    1. 年:

      <div id="birthday"> 
          <div> 
           <label for="day">Day</label> 
           <input type="number" id="day" placeholder="Day" name="day" ref="day" /> 
          </div> 
          <div> 
           <label for="month">Month</label> 
           <input type="number" id="month" placeholder="Month" name="month" ref="month" /> 
          </div> 
          <div> 
           <label for="year">Year</label> 
           <input type="number" id="year" placeholder="Year" name="year" ref="year" /> 
          </div> 
          <span class="clear_both"></span> 
      </div> 
      

      は、私は、次の日付を検証します年。そして、年がうるう年であると月が2(2月)の場合

    2. 12から1の間
    • 月でなければなりません日は1から29の間である必要があります
    • 年がleaでない場合Pの年、その日が月によっては30に31または1から1の間でなければなりません
  • 私は月と年を確認することができます。

    let day = this.refs.day.value 
    let month = this.refs.month.value 
    let year = this.refs.year.value 
    let errors = [] 
    
    if (!((year.length == 4) && (year > 1900 && year < 2016))) { 
        errors.push("year"); 
    } 
    if (!(month > 0 && month < 13)) { 
        errors.push("month"); 
    } 
    

    は、どのように私はこれを行うことができますjavascriptで動作しますか?手伝っていただけませんか。ありがとうございました。

    +0

    見る(http://stackoverflow.com/questions/5812220/how-to-validate-a-date/5812341#5812341) 。 – RobG

    +0

    @RobGそれはさらに良いです。ありがとうございました。 – Karl

    答えて

    0

    user3817980と同様に、このquestionに基づいていますが、あなたのコードに組み込まれ、以下を参照してください。

    私はまた、その日がネガティブではないことを確認しています。これは過度のことかもしれませんが、害はありません。

    let day = this.refs.day.value 
    let month = this.refs.month.value 
    let year = this.refs.year.value 
    var monthLength = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; 
    
    // Adjust for leap years 
    if(year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)) 
        monthLength[1] = 29; 
    
    let errors = [] 
    
    if (!((year.length == 4) && (year > 1900 && year < 2016))) { 
        errors.push("year"); 
    } 
    
    if (!(month > 0 && month < 13)) { 
        errors.push("month"); 
    } 
    
    if (day < 0 || day > monthLength[month - 1]) { 
        errors.push("day"); 
    } 
    
    +0

    これは問題なく動作しています。しかし、バグがあると思います。日が34、月が45、年号が1111の場合、エラー配列には「日」の項目はありません。または、月の日が34、月が45、年が1909であるとします。エラー配列には「日」の項目がありません。 – Karl

    2

    これは役に立ちます。

    function daysInMonth(m, y) { // Month is indexed as 0-11 
        switch (m) { 
         case 1 : 
          return (y % 4 === 0 && y % 100) || y % 400 === 0 ? 29 : 28; 
         case 8 : case 3 : case 5 : case 10 : 
          return 30; 
         default : 
          return 31 
        } 
    } 
    
    function isValid(d, m, y) { 
        return m >= 0 && m < 12 && d > 0 && d <= daysInMonth(m, y); 
    } 
    
    1

    ここに自分自身の質問に答える。アンドレアの答えは正しい方向に私を指摘した。私はこの答えでクリアしたバグがありましたが、バグは、月がmonthLengthの項目のリストよりも大きかった場合、その日を間違ったものにするだろうということでした。また、選択した月の日数が1日から合計日数の間であるかどうかを確認するために変更されました。そこでここでは、完全なスクリプトは次のとおりです。[日付を検証する方法* *?]

    let day = this.refs.day.value 
    let month = this.refs.month.value 
    let year = this.refs.year.value 
    var monthLength = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; 
    var total_days = 0; 
    
    // Adjust for leap years 
    if(year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)) 
        monthLength[1] = 29; 
    
    let errors = [] 
    
    console.log('total_days = ' + total_days); 
    
    if (!((year.length == 4) && (year > 1900 && year < 2016))) { 
        errors.push("year"); 
    } 
    
    if (!(month > 0 && month < 13)) { 
        errors.push("month"); 
        total_days = monthLength[0]; 
    } 
    else { 
        total_days = monthLength[month - 1]; 
    } 
    
    if (!(day > 0 && day <= total_days)) { 
        errors.push("day"); 
    }