@@ -260,6 +260,8 @@ class ConFormattedDate(dt.date):
260260
261261 DATE_FORMAT : ClassVar [Optional [str ]] = None
262262 """The specific format of the date as a Python 'strptime' string."""
263+ strict : ClassVar [Optional [bool ]] = False
264+ """Add additional check to ensure that date supplied meets the date format exactly."""
263265 ge : ClassVar [Optional [dt .date ]] = None
264266 """The earliest date allowed."""
265267 le : ClassVar [Optional [dt .date ]] = None
@@ -280,6 +282,8 @@ def validate(cls, value: Optional[Union[dt.date, str]]) -> Optional[dt.date]:
280282 elif cls .DATE_FORMAT is not None :
281283 try :
282284 date = dt .datetime .strptime (value , cls .DATE_FORMAT ).date ()
285+ if cls .strict and (date .strftime (cls .DATE_FORMAT ) != value ):
286+ raise ValueError
283287 except ValueError as err :
284288 raise ValueError (
285289 f"Unable to parse provided datetime in format { cls .DATE_FORMAT } "
@@ -317,6 +321,7 @@ def __get_validators__(cls) -> Iterator[classmethod]:
317321@validate_arguments
318322def conformatteddate (
319323 date_format : Optional [str ] = None ,
324+ strict : Optional [bool ] = False ,
320325 ge : Optional [dt .date ] = None , # pylint: disable=invalid-name
321326 le : Optional [dt .date ] = None , # pylint: disable=invalid-name
322327 gt : Optional [dt .date ] = None , # pylint: disable=invalid-name
@@ -331,6 +336,7 @@ def conformatteddate(
331336
332337 dict_ = ConFormattedDate .__dict__ .copy ()
333338 dict_ ["DATE_FORMAT" ] = date_format
339+ dict_ ["strict" ] = strict
334340 dict_ ["ge" ] = ge
335341 dict_ ["le" ] = le
336342 dict_ ["gt" ] = gt
0 commit comments