2016-07-25 15 views
5

Mam trzy wejścia, które są na dzień, miesiąc i rok.Sprawdź poprawną datę według dni, miesięcy i rok

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

Chcę potwierdzić datę brzmienie:

  1. Roku

    • Rok powinien mieć 4 znaków (tj yyyy)
    • Rok powinna wynosić od 1900 do przedstawienia rok.
  2. Miesiąc

    • Miesiąc powinna wynosić od 1 do 12
  3. Dzień

    • Jeśli rok jest rokiem przestępnym i miesiąc wynosi 2 (luty), a następnie Dzień powinien wynosić od 1 do 29
    • Jeśli nie jest to rok lat p, wtedy dzień powinna wynosić od 1 do 31 lub od 1 do 30 w zależności od miesiąca

mogę sprawdzić tylko miesiąc i rok:

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

Jak mogę zrobić to pracować w javascript? Czy mógłbyś mi pomóc. Dziękuję Ci.

+0

See [? * Jak potwierdzić datę *] (http://stackoverflow.com/questions/5812220/how-to-validate-a-date/5812341#5812341) . – RobG

+0

@RobG To jeszcze lepiej. Dziękuję Ci. – Karl

Odpowiedz

0

podobne do user3817980, i na podstawie tego question ale wbudowany w kodzie, patrz poniżej.

Sprawdzam również, czy dzień nie jest ujemny, co może być przesadą, ale nie szkodzi.

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

To działa dobrze. Ale myślę, że jest błąd. Załóżmy, że jeśli dzień wynosi 34, miesiąc to 45, a rok 1111, w tablicy błędów nie ma elementu "dzień". Lub przypuśćmy, że dzień miesiąca to 34, miesiąc to 45, a rok 1909, nawet wtedy nie ma elementu "dzień" w tablicy błędów. – Karl

2

To może ci pomóc.

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

Odpowiadając na moje własne pytanie tutaj. Odpowiedź Andrei wskazała mi właściwy kierunek. Chociaż był błąd, który wyjaśniłem w tej odpowiedzi. Błąd polegał na tym, że jeśli miesiąc był większy niż lista przedmiotów w monthLength, to sprawił, że dzień się nie spełnił. Zmieniono również w celu sprawdzenia, czy dni mieszczą się w przedziale od 1 do łącznych dni w tym wybranym miesiącu. Więc tutaj jest pełny scenariusz:

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"); 
} 
Powiązane problemy