1import sys
2
3from tzlocal import get_localzone
4
5from .conf import apply_settings
6from .timezone_parser import pop_tz_offset_from_string
7from .utils import apply_timezone, localize_timezone, strip_braces
8
9
10class DateParser:
11 @apply_settings
12 def parse(self, date_string, parse_method, settings=None):
13 date_string = str(date_string)
14
15 if not date_string.strip():
16 raise ValueError("Empty string")
17
18 date_string = strip_braces(date_string)
19 date_string, ptz = pop_tz_offset_from_string(date_string)
20
21 date_obj, period = parse_method(date_string, settings=settings, tz=ptz)
22
23 _settings_tz = settings.TIMEZONE.lower()
24
25 if ptz:
26 if hasattr(ptz, "localize"):
27 date_obj = ptz.localize(date_obj)
28 else:
29 date_obj = date_obj.replace(tzinfo=ptz)
30 if "local" not in _settings_tz:
31 date_obj = apply_timezone(date_obj, settings.TIMEZONE)
32 else:
33 if "local" in _settings_tz:
34 stz = get_localzone()
35 if hasattr(stz, "localize") and sys.version_info < (3, 6):
36 date_obj = stz.localize(date_obj)
37 else:
38 date_obj = date_obj.replace(tzinfo=stz)
39 else:
40 date_obj = localize_timezone(date_obj, settings.TIMEZONE)
41
42 if settings.TO_TIMEZONE:
43 date_obj = apply_timezone(date_obj, settings.TO_TIMEZONE)
44
45 if not settings.RETURN_AS_TIMEZONE_AWARE or (
46 settings.RETURN_AS_TIMEZONE_AWARE
47 and "default" == settings.RETURN_AS_TIMEZONE_AWARE
48 and not ptz
49 ):
50 date_obj = date_obj.replace(tzinfo=None)
51
52 return date_obj, period
53
54
55date_parser = DateParser()