मानदंड:
प्रत्येक वर्ष 4 से विभाज्य एक लीप वर्ष है, सिवाय इसके कि यह 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
फरवरी में एक लीप वर्ष में 29 दिन होते हैं और एक लीप वर्ष में 28 नहीं होते हैं
अप्रैल, जून, सितंबर और नवंबर में 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 से 31 दिसंबर 2999 तक तारीखों के लिए परीक्षण करेंगे। तकनीकी रूप से वर्तमान में इस्तेमाल किया गया ग्रेगोरियन कैलेंडर केवल 1753 में ब्रिटिश साम्राज्य और यूरोप के देशों में 1600 के दशक में विभिन्न वर्षों में उपयोग में आया था, लेकिन मैं नहीं जा रहा हूं उस की चिंता करो।
एक लीप वर्ष के लिए परीक्षण करने के लिए Regex:
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)
वैध माह और दिन फरवरी को छोड़कर (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 दिनों के साथ फरवरी:
02-(0[1-9]|1\d|2[0-8])
फरवरी 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]))))
इसलिए आपके पास यह 1 जनवरी 1000 और 31 दिसंबर 2999 के बीच YYYY-MM-DD प्रारूप में दिनांक के लिए एक regex है।
मुझे संदेह है कि इसे थोड़ा छोटा किया जा सकता है, लेकिन मैं इसे किसी और को छोड़ दूंगा।
जो सभी मान्य तिथियों से मेल खाएगा। यदि आप चाहते हैं कि यह केवल तभी मान्य हो जब इसमें सिर्फ एक तिथि हो और कुछ नहीं, तो इसे इस ^( )$
तरह से लपेटें :
^(((((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";
या पीएचपीcheckdate ( int $month , int $day , int $year )
।