Ich versuche, einen allgemeinen Weg aufzuschreiben, um zu überprüfen, ob eine bestimmte tzinfo UTC darstellt.
Bisher ist die beste Lösung, die ich gefunden habe, die folgende:
def check_tzinfo_is_utc(tz_info: Optional[Type[tzinfo]]) -> bool:
is_tzinfo_utc = False
try:
is_tzinfo_utc = tz_info.utcoffset(datetime.utcnow()) == timedelta(0)
except AttributeError:
logger.warning(f"tzinfo is not a tzinfo object: {tz_info}")
return is_tzinfo_utc
wo die Idee ist, zu versuchen, das bereitgestellte tzinfo
zu verwenden, um den utc-Offset eines beliebigen nativen datetime-Objekts zu erhalten.
Wenn das tzinfo
nicht korrekt ist, sollte die except
Anweisung es erfassen und die Funktion zurückgeben False
.
Ich habe diese Funktion mit Blick auf eine begrenzte Anzahl von Anwendungsfällen geschrieben. Sehen Sie einige potenzielle Verbesserungen und Grenzfälle, in denen diese Funktion fehlschlagen würde?
Vielen Dank!
Lösung des Problems
Der Vergleich des tzinfo-Objekts mit einer Reihe von Objekten, die Sie als "UTC" betrachten, ist möglicherweise eine robustere Option, z
from datetime import datetime, timezone, timedelta
from zoneinfo import ZoneInfo
import pytz
import dateutil
# what to consider UTC
is_utc = (
timezone(timedelta(0)),
timezone.utc,
pytz.utc,
ZoneInfo("UTC"),
dateutil.tz.UTC, # <- this one is not hashable, so use a tuple, not a set
)
def dt_has_utclike_tz(dt, is_utc):
if dt.tzinfo is None:
return False
return dt.tzinfo in is_utc
for z in (
None,
ZoneInfo("Europe/London"),
pytz.utc,
timezone(timedelta(hours=-5)),
dateutil.tz.UTC,
):
print(z, dt_has_utclike_tz(datetime(2022, 1, 1, tzinfo=z), is_utc))
print(
"UTC offset zero?", datetime(2022, 1, 1, tzinfo=z).utcoffset() == timedelta(0)
)
# None False
# UTC offset zero? False
# Europe/London False
# UTC offset zero? True # <- note this one...
# UTC True
# UTC offset zero? True
# UTC-05:00 False
# UTC offset zero? False
# tzutc() True
# UTC offset zero? True
Keine Kommentare:
Kommentar veröffentlichen