45 lines
1.2 KiB
Python
45 lines
1.2 KiB
Python
|
"""
|
||
|
Timezone utility functions.
|
||
|
"""
|
||
|
|
||
|
# Copyright (C) 2020 The Psycopg Team
|
||
|
|
||
|
import logging
|
||
|
from typing import Dict, Optional, Union
|
||
|
from datetime import timezone, tzinfo
|
||
|
|
||
|
from .pq.abc import PGconn
|
||
|
from ._compat import ZoneInfo
|
||
|
|
||
|
logger = logging.getLogger("psycopg")
|
||
|
|
||
|
_timezones: Dict[Union[None, bytes], tzinfo] = {
|
||
|
None: timezone.utc,
|
||
|
b"UTC": timezone.utc,
|
||
|
}
|
||
|
|
||
|
|
||
|
def get_tzinfo(pgconn: Optional[PGconn]) -> tzinfo:
|
||
|
"""Return the Python timezone info of the connection's timezone."""
|
||
|
tzname = pgconn.parameter_status(b"TimeZone") if pgconn else None
|
||
|
try:
|
||
|
return _timezones[tzname]
|
||
|
except KeyError:
|
||
|
sname = tzname.decode() if tzname else "UTC"
|
||
|
try:
|
||
|
zi: tzinfo = ZoneInfo(sname)
|
||
|
except (KeyError, OSError):
|
||
|
logger.warning("unknown PostgreSQL timezone: %r; will use UTC", sname)
|
||
|
zi = timezone.utc
|
||
|
except Exception as ex:
|
||
|
logger.warning(
|
||
|
"error handling PostgreSQL timezone: %r; will use UTC (%s - %s)",
|
||
|
sname,
|
||
|
type(ex).__name__,
|
||
|
ex,
|
||
|
)
|
||
|
zi = timezone.utc
|
||
|
|
||
|
_timezones[tzname] = zi
|
||
|
return zi
|