@@ -23,6 +23,71 @@ private static function validateYear(string $ano, string $mes, string $dia): boo
2323 return false ;
2424 }
2525
26+ private static function isCalendarDateTime (string $ input ): bool
27+ {
28+ $ pattern = '/^\d{4}((-?\d{2})(-?\d{2})?)?(T\d{2}(:?\d{2}(:?\d{2}(\.\d+)?)?)?(Z|[+-]\d{2}(:?\d{2})?)?)?$/ ' ;
29+ if (!preg_match ($ pattern , $ input )) {
30+ return false ;
31+ }
32+ try {
33+ $ date = new \DateTime ($ input );
34+ if (str_contains ($ input , '- ' )) {
35+ $ parts = explode ('T ' , $ input )[0 ];
36+ if (count (explode ('- ' , $ parts )) === 3 && $ date ->format ('Y-m-d ' ) !== $ parts ) {
37+ return false ;
38+ }
39+ }
40+ return true ;
41+ } catch (\Exception ) {
42+ return false ;
43+ }
44+ }
45+
46+ private static function isWeekDate (string $ input ): bool
47+ {
48+ $ pattern = '/^(\d{4})-?W(0[1-9]|[1-4][0-9]|5[0-3])(-?([1-7]))?$/ ' ;
49+ if (!preg_match ($ pattern , $ input , $ matches )) {
50+ return false ;
51+ }
52+ $ year = (int )$ matches [1 ];
53+ $ week = (int )$ matches [2 ];
54+ if ($ week === 53 ) {
55+ $ date = new \DateTime ();
56+ $ date ->setISODate ($ year , 53 );
57+ return $ date ->format ('W ' ) === '53 ' ;
58+ }
59+ return true ;
60+ }
61+
62+ private static function isOrdinalDate (string $ input ): bool
63+ {
64+ if (!preg_match ('/^(\d{4})-?(\d{3})$/ ' , $ input , $ matches )) {
65+ return false ;
66+ }
67+ $ year = (int )$ matches [1 ];
68+ $ dayOfYear = (int )$ matches [2 ];
69+ $ isLeap = ($ year % 4 === 0 && ($ year % 100 !== 0 || $ year % 400 === 0 ));
70+ return $ dayOfYear >= 1 && $ dayOfYear <= ($ isLeap ? 366 : 365 );
71+ }
72+
73+ private static function isDuration (string $ input ): bool
74+ {
75+ $ pattern = '/^P(?!$)(\d+Y)?(\d+M)?(\d+W)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+S)?)?$/ ' ;
76+ return (bool ) preg_match ($ pattern , $ input );
77+ }
78+
79+ private static function isInterval (string $ input ): bool
80+ {
81+ if (!str_contains ($ input , '/ ' )) {
82+ return false ;
83+ }
84+ $ parts = explode ('/ ' , $ input );
85+ if (count ($ parts ) !== 2 ) {
86+ return false ;
87+ }
88+ return (self ::validateDateIso8601 ($ parts [0 ]) && self ::validateDateIso8601 ($ parts [1 ]));
89+ }
90+
2691 public static function validateDateBrazil (string $ data ): bool
2792 {
2893 if (strlen ($ data ) < 8 ) {
@@ -96,69 +161,4 @@ public static function validateDateIso8601(string $input): bool
96161 return self ::isCalendarDateTime ($ input ) || self ::isDuration ($ input ) || self ::isWeekDate ($ input )
97162 || self ::isOrdinalDate ($ input ) || self ::isInterval ($ input );
98163 }
99-
100- private static function isCalendarDateTime (string $ input ): bool
101- {
102- $ pattern = '/^\d{4}((-?\d{2})(-?\d{2})?)?(T\d{2}(:?\d{2}(:?\d{2}(\.\d+)?)?)?(Z|[+-]\d{2}(:?\d{2})?)?)?$/ ' ;
103- if (!preg_match ($ pattern , $ input )) {
104- return false ;
105- }
106- try {
107- $ date = new \DateTime ($ input );
108- if (str_contains ($ input , '- ' )) {
109- $ parts = explode ('T ' , $ input )[0 ];
110- if (count (explode ('- ' , $ parts )) === 3 && $ date ->format ('Y-m-d ' ) !== $ parts ) {
111- return false ;
112- }
113- }
114- return true ;
115- } catch (\Exception ) {
116- return false ;
117- }
118- }
119-
120- private static function isWeekDate (string $ input ): bool
121- {
122- $ pattern = '/^(\d{4})-?W(0[1-9]|[1-4][0-9]|5[0-3])(-?([1-7]))?$/ ' ;
123- if (!preg_match ($ pattern , $ input , $ matches )) {
124- return false ;
125- }
126- $ year = (int )$ matches [1 ];
127- $ week = (int )$ matches [2 ];
128- if ($ week === 53 ) {
129- $ date = new \DateTime ();
130- $ date ->setISODate ($ year , 53 );
131- return $ date ->format ('W ' ) === '53 ' ;
132- }
133- return true ;
134- }
135-
136- private static function isOrdinalDate (string $ input ): bool
137- {
138- if (!preg_match ('/^(\d{4})-?(\d{3})$/ ' , $ input , $ matches )) {
139- return false ;
140- }
141- $ year = (int )$ matches [1 ];
142- $ dayOfYear = (int )$ matches [2 ];
143- $ isLeap = ($ year % 4 === 0 && ($ year % 100 !== 0 || $ year % 400 === 0 ));
144- return $ dayOfYear >= 1 && $ dayOfYear <= ($ isLeap ? 366 : 365 );
145- }
146-
147- private static function isDuration (string $ input ): bool
148- {
149- $ pattern = '/^P(?!$)(\d+Y)?(\d+M)?(\d+W)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+S)?)?$/ ' ;
150- return (bool ) preg_match ($ pattern , $ input );
151- }
152-
153- private static function isInterval (string $ input ): bool
154- {
155- if (!str_contains ($ input , '/ ' )) {
156- return false ;
157- }
158- $ parts = explode ('/ ' , $ input );
159- if (count ($ parts ) !== 2 ) {
160- return false ;
161- }
162- return (self ::validateDateIso8601 ($ parts [0 ]) && self ::validateDateIso8601 ($ parts [1 ]));
163- }
164164}
0 commit comments