GOOGLE ADS

Dienstag, 12. April 2022

Überprüfen Sie, ob python tzinfo UTC ist

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 tzinfozu verwenden, um den utc-Offset eines beliebigen nativen datetime-Objekts zu erhalten.

Wenn das tzinfonicht korrekt ist, sollte die exceptAnweisung 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

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...