2016-07-25 22 views
5

Tôi có ba yếu tố đầu vào dành cho Ngày, Tháng và Năm.Kiểm tra ngày hợp lệ theo Ngày, Tháng và Năm

<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> 

Tôi muốn xác nhận cập nhật bằng cách như sau:

  1. Năm

    • năm nên có 4 ký tự (ví dụ, YYYY)
    • năm nên từ năm 1900 đến nay năm.
  2. Tháng

    • Tháng nên được giữa 1-12
  3. ngày

    • Nếu năm là năm nhuận và tháng 2 (tháng hai) sau đó Ngày phải nằm trong khoảng từ 1 đến 29
    • Nếu năm đó không phải là một lá p năm, thì ngày nên được giữa 1-31 hoặc 1-30 tùy thuộc vào tháng

tôi chỉ có thể kiểm tra các tháng, năm:

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"); 
} 

Làm thế nào tôi có thể làm này làm việc trong javascript? Liệu bạn có thể giúp mình không. Cảm ơn bạn.

+0

Xem [? * Làm thế nào để xác nhận một ngày *] (http://stackoverflow.com/questions/5812220/how-to-validate-a-date/5812341#5812341) . – RobG

+0

@RobG Điều đó thậm chí còn tốt hơn. Cảm ơn bạn. – Karl

Trả lời

0

Tương tự như user3817980 và dựa trên mã này question nhưng được tích hợp vào mã của bạn, hãy xem bên dưới.

Tôi cũng kiểm tra xem ngày đó không tiêu cực, có thể là quá mức nhưng không gây hại.

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

Điều này hoạt động tốt. Nhưng tôi nghĩ có một lỗi. Giả sử nếu ngày là 34, tháng là 45 và năm 1111, trong mảng lỗi, không có mục "ngày". Hoặc giả sử ngày tháng là 34, tháng là 45 và năm là 1909, thậm chí không có mục "ngày" trong mảng lỗi. – Karl

2

Điều này có thể giúp bạn.

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

Trả lời câu hỏi của riêng tôi tại đây. Câu trả lời của Andrea hướng tôi đi đúng hướng. Mặc dù có một lỗi, mà tôi đã xóa trong câu trả lời này. Lỗi là, nếu tháng lớn hơn danh sách các mặt hàng trong monthLength nó sẽ làm cho ngày sai. Cũng thay đổi để kiểm tra xem ngày có nằm trong khoảng từ 1 đến tổng số ngày cho tháng đã chọn đó hay không. Vì vậy, đây là kịch bản đầy đủ:

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"); 
} 
Các vấn đề liên quan