1234567891011121314151617181920212223242526272829303132333435363738394041 |
- import os
- from datetime import datetime
- from typing import Tuple
- import pytz
- tzlocal = None
- try:
- import tzlocal # Maybe we can use the tzlocal module to get a safe timezone
- except ImportError:
- pass
- # Set the local timezone for DateTime conversions. Note in most cases we want to use either UTC or the server
- # timezone, but if someone insists on using the local timezone we will try to convert. The problem is we
- # never have anything but an epoch timestamp returned from ClickHouse, so attempts to convert times when the
- # local timezone is "DST" aware (like 'CEST' vs 'CET') will be wrong approximately half the time
- local_tz: pytz.timezone
- local_tz_dst_safe: bool = False
- def normalize_timezone(timezone: pytz.timezone) -> Tuple[pytz.timezone, bool]:
- if timezone.tzname(None) in ('UTC', 'GMT', 'Universal', 'GMT-0', 'Zulu', 'Greenwich'):
- return pytz.UTC, True
- if timezone.tzname(None) in pytz.common_timezones:
- return timezone, True
- if tzlocal is not None: # Maybe we can use the tzlocal module to get a safe timezone
- local_name = tzlocal.get_localzone_name()
- if local_name in pytz.common_timezones:
- return pytz.timezone(local_name), True
- return timezone, False
- try:
- local_tz = pytz.timezone(os.environ.get('TZ', ''))
- except pytz.UnknownTimeZoneError:
- local_tz = datetime.now().astimezone().tzinfo
- local_tz, local_tz_dst_safe = normalize_timezone(local_tz)
|