From: Jeremy Stanley Date: Sat, 11 May 2024 00:57:27 +0000 (+0000) Subject: Implement time zone aware expiration comparisons X-Git-Tag: 2.5.0~4 X-Git-Url: https://yuggoth.org/gitweb?a=commitdiff_plain;h=5b44af7beca9731ab0b3b44506068606a7b1a628;p=weather.git Implement time zone aware expiration comparisons Instead of using a naive time comparison, check times relative to the user's time zone (shifted to UTC) and the expiration times embedded in NWS documents (implicitly UTC). Drop the ugly hack of the 24-hour expiry delay, but keep it at 1 hour to still provide some protection against premature filtering in case someone switches into or out of DST on a different date than NWS expects it to happen. --- diff --git a/weather.py b/weather.py index 62f73da..90f155c 100644 --- a/weather.py +++ b/weather.py @@ -341,26 +341,20 @@ def get_alert( muted = True else: muted = False + expirycheck = re.search(r"Expires:([0-9]{12})", alert) + if expirycheck: + # only report alerts and forecasts that expired less than + # offset ago + import datetime, zoneinfo + expiration = datetime.datetime.fromisoformat( + "%sT%sZ" % (expirycheck[1][:8], expirycheck[1][-4:])) + now = datetime.datetime.now(tz=zoneinfo.ZoneInfo("UTC")) + # TODO: make this offset configurable + if now - expiration > datetime.timedelta(hours=1): + return "" lines = alert.split("\n") - import time - # TODO: make this offset configurable - # TODO: adjust offset relative to the difference between the user's - # local time and the zone's local time (will need to extend - # the schema in the zones file to store each tz - offset = 86400 # one day - - # report alerts and forecasts that expired less than offset ago; - # this is a cheap hack since expiration times seem to be relative - # to the zone's local time zone, and converting from the user's - # would get complicated, but also there can sometimes be a lag - # between expiration and the next update - valid_time = time.strftime( - "%Y%m%d%H%M", time.localtime(time.time() - offset)) output = [] for line in lines: - if line.startswith("Expires:") \ - and "Expires:" + valid_time > line: - return "" if muted and line.startswith("National Weather Service"): muted = False line = ""