Kriterien:
Jedes durch 4 teilbare Jahr ist ein Schaltjahr, außer wenn es durch 100 teilbar ist, es sei denn, es ist durch 400 teilbar. Also:
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
Der Februar hat 29 Tage in einem Schaltjahr und 28 Tage, wenn kein Schaltjahr
30 Tage im April, Juni, September und November
31 Tage im Januar, März, Mai, Juli, August, Oktober und Dezember
Prüfung:
Die folgenden Daten sollten alle die Validierung bestehen:
1976-02-29
2000-02-29
2004-02-29
1999-01-31
Die folgenden Daten sollten alle nicht validiert werden:
2015-02-29
2015-04-31
1900-02-29
1999-01-32
2015-02-00
Angebot:
Wir werden auf Daten vom 1. Januar 1000 bis 31. Dezember 2999 testen. Technisch gesehen wurde der derzeit verwendete Gregorianische Kalender erst 1753 für das britische Empire und zu verschiedenen Jahren im 17. Jahrhundert für Länder in Europa verwendet, aber ich werde es nicht tun mach dir darüber Sorgen.
Regex zum Testen für ein Schaltjahr:
Die durch 400 teilbaren Jahre:
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
Die durch 4 teilbaren Jahre:
[12]\d([02468][048]|[13579][26])
Die durch 100 teilbaren Jahre:
[12]\d00
Nicht teilbar durch 100:
[12]\d([1-9]\d|\d[1-9])
Die Jahre teilbar durch 100 aber nicht durch 400:
((1[1345789])|(2[1235679]))00
Teilbar durch 4 aber nicht durch 100:
[12]\d([2468][048]|[13579][26]|0[48])
Die Schaltjahre:
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])
Nicht teilbar durch 4:
[12]\d([02468][1235679]|[13579][01345789])
Kein Schaltjahr:
Not divisible by 4 OR is divisible by 100 but not by 400
([12]\d([02468][1235679]|[13579][01345789]))|(((1[1345789])|(2[1235679]))00)
Gültiger Monat und Tag außer Februar (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))
Februar mit 28 Tagen:
02-(0[1-9]|1\d|2[0-8])
Februar mit 29 Tagen:
02-(0[1-9]|[12]\d)
Gültiges Datum:
(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]))))
Dort haben Sie also eine Regex für Daten zwischen dem 1. Januar 1000 und dem 31. Dezember 2999 im Format JJJJ-MM-TT.
Ich vermute, es kann ziemlich verkürzt werden, aber das überlasse ich jemand anderem.
Das stimmt mit allen gültigen Daten überein. Wenn Sie möchten, dass es nur gültig ist, wenn es nur ein Datum und nichts anderes enthält, wickeln Sie es ^( )$
wie folgt ein:
^(((((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])))))$
Wenn Sie es für einen optionalen Datumseintrag wünschen (dh es kann ein leeres oder ein gültiges Datum sein), fügen Sie es ^$|
am Anfang wie folgt hinzu:
^$|^(((((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";
oder PHPscheckdate ( int $month , int $day , int $year )
.