기준 :
4로 나눌 수있는 매년은 윤년입니다. 단, 400으로 나눌 수없는 한 100으로 나눌 수있는 경우는 예외입니다. 따라서 :
2004 - leap year - divisible by 4
1900 - not a leap year - divisible by 4, but also divisible by 100
2000 - leap year - divisible by 4, also divisible by 100, but divisible by 400
2 월은 윤년에 29 일, 윤년이 아닌 경우 28 일입니다.
4 월, 6 월, 9 월, 11 월 30 일
1 월, 3 월, 5 월, 7 월, 8 월, 10 월, 12 월 31 일
테스트:
다음 날짜는 모두 유효성 검사를 통과해야합니다.
1976-02-29
2000-02-29
2004-02-29
1999-01-31
다음 날짜는 모두 유효성 검사에 실패해야합니다.
2015-02-29
2015-04-31
1900-02-29
1999-01-32
2015-02-00
범위:
1000 년 1 월 1 일부터 2999 년 12 월 31 일까지의 날짜를 테스트 할 것입니다. 기술적으로 현재 사용되는 그레고리력은 대영 제국의 경우 1753 년, 유럽 국가의 경우 1600 년대의 여러 해에 사용되었지만 그것에 대해 걱정하십시오.
윤년 테스트를위한 정규식 :
400으로 나눌 수있는 연도 :
1200|1600|2000|2400|2800
can be shortened to:
(1[26]|2[048])00
if you wanted all years from 1AD to 9999 then this would do it:
(0[48]|[13579][26]|[2468][048])00
if you're happy with accepting 0000 as a valid year then it can be shortened:
([13579][26]|[02468][048])00
4로 나눌 수있는 연도 :
[12]\d([02468][048]|[13579][26])
100으로 나눌 수있는 연도 :
[12]\d00
100으로 나눌 수 없음 :
[12]\d([1-9]\d|\d[1-9])
100으로 나눌 수 있지만 400으로 나눌 수없는 연도 :
((1[1345789])|(2[1235679]))00
4로 나눌 수 있지만 100으로 나눌 수 없음 :
[12]\d([2468][048]|[13579][26]|0[48])
윤년 :
divisible by 400 or (divisible by 4 and not divisible by 100)
((1[26]|2[048])00)|[12]\d([2468][048]|[13579][26]|0[48])
4로 나눌 수 없습니다.
[12]\d([02468][1235679]|[13579][01345789])
윤년이 아닙니다.
Not divisible by 4 OR is divisible by 100 but not by 400
([12]\d([02468][1235679]|[13579][01345789]))|(((1[1345789])|(2[1235679]))00)
2 월을 제외한 유효한 월 및 일 (MM-DD) :
((01|03|05|07|08|10|12)-(0[1-9]|[12]\d|3[01]))|((04|06|09|11)-(0[1-9]|[12]\d|30))
shortened to:
((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30))
28 일이 포함 된 2 월 :
02-(0[1-9]|1\d|2[0-8])
29 일이 포함 된 2 월 :
02-(0[1-9]|[12]\d)
유효한 날짜 :
(leap year followed by (valid month-day-excluding-february OR 29-day-february))
OR
(non leap year followed by (valid month-day-excluding-february OR 28-day-february))
((((1[26]|2[048])00)|[12]\d([2468][048]|[13579][26]|0[48]))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|[12]\d))))|((([12]\d([02468][1235679]|[13579][01345789]))|((1[1345789]|2[1235679])00))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|1\d|2[0-8]))))
그래서 거기에 YYYY-MM-DD 형식의 1000 년 1 월 1 일과 2999 년 12 월 31 일 사이의 날짜에 대한 정규식이 있습니다.
상당히 단축 될 수 있다고 생각하지만 다른 사람에게 맡기겠습니다.
유효한 모든 날짜와 일치합니다. 날짜가 하나만 있고 다른 것이없는 경우에만 유효하도록하려면 다음 ^( )$
과 같이 래핑합니다 .
^(((((1[26]|2[048])00)|[12]\d([2468][048]|[13579][26]|0[48]))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|[12]\d))))|((([12]\d([02468][1235679]|[13579][01345789]))|((1[1345789]|2[1235679])00))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|1\d|2[0-8])))))$
선택적 날짜 항목 (즉, 비어 있거나 유효한 날짜 일 수 있음)을 원하는 경우 다음을 추가하십시오. ^$|
과 같이 처음에 .
^$|^(((((1[26]|2[048])00)|[12]\d([2468][048]|[13579][26]|0[48]))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|[12]\d))))|((([12]\d([02468][1235679]|[13579][01345789]))|((1[1345789]|2[1235679])00))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|1\d|2[0-8])))))$
date("Y-m-d", strtotime("2012-09-12"))=="2012-09-12";
또는 PHP의checkdate ( int $month , int $day , int $year )
.