条件:
每年被4整除的年份是is年,除非它可以被100整除,除非可以被400整除。
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月在a年有29天,在非a年有28天
4月,6月,9月和11月的30天
一月,三月,五月,七月,八月,十月和十二月的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年代的不同年份用于欧洲国家,但我不会担心那个。
正则表达式测试a年:
可除以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])
years年:
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])
不是a年:
Not divisible by 4 OR is divisible by 100 but not by 400
([12]\d([02468][1235679]|[13579][01345789]))|(((1[1345789])|(2[1235679]))00)
有效月份,不包括二月(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))
2月,共28天:
02-(0[1-9]|1\d|2[0-8])
2月,共29天:
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";
或PHPcheckdate ( int $month , int $day , int $year )
。