37 lines
998 B
Python
37 lines
998 B
Python
from __future__ import annotations
|
|
|
|
from functools import lru_cache
|
|
from typing import TYPE_CHECKING
|
|
|
|
import dateparser
|
|
from django.utils import timezone
|
|
|
|
if TYPE_CHECKING:
|
|
from datetime import datetime
|
|
|
|
|
|
@lru_cache(maxsize=40 * 40 * 1024)
|
|
def parse_date(value: str) -> datetime | None:
|
|
"""Parse a datetime string into a timezone-aware datetime using dateparser.
|
|
|
|
Args:
|
|
value: The datetime string to parse.
|
|
|
|
Returns:
|
|
A timezone-aware datetime object or None if parsing fails.
|
|
"""
|
|
dateparser_settings: dict[str, bool | int] = {
|
|
"RETURN_AS_TIMEZONE_AWARE": True,
|
|
"CACHE_SIZE_LIMIT": 0,
|
|
}
|
|
dt: datetime | None = dateparser.parse(
|
|
date_string=value,
|
|
settings=dateparser_settings, # pyright: ignore[reportArgumentType]
|
|
)
|
|
if not dt:
|
|
return None
|
|
|
|
# Ensure aware in Django's current timezone
|
|
if timezone.is_naive(dt):
|
|
dt = timezone.make_aware(dt, timezone.get_current_timezone())
|
|
return dt
|