Show economist publication times over the year

This commit is contained in:
Edward Betts 2023-11-05 18:01:08 +00:00
parent 592710a28c
commit cb7f7536a9
3 changed files with 28 additions and 25 deletions

View file

@ -336,7 +336,7 @@ async def get_data(now: datetime) -> typing.Mapping[str, str | object]:
reply = { reply = {
"now": now, "now": now,
"gbpusd": gbpusd, "gbpusd": gbpusd,
"next_economist": economist.next_pub_date(today), "economist": economist.publication_dates(last_year, next_year),
"bank_holiday": bank_holiday, "bank_holiday": bank_holiday,
"us_holiday": get_us_holidays(last_year, next_year), "us_holiday": get_us_holidays(last_year, next_year),
"next_us_presidential_election": next_us_presidential_election, "next_us_presidential_election": next_us_presidential_election,

View file

@ -1,32 +1,35 @@
"""Next publication date of the Economist.""" """Next publication date of the Economist."""
from datetime import date, timedelta from datetime import date, datetime, time, timedelta
import pytz
from .types import Event
uk_tz = pytz.timezone("Europe/London")
def next_pub_date(input_date: date) -> date: def add_pub_time(pub_date: date) -> datetime:
"""Next date that the Economist is published.""" """Publication time is 19:00."""
# Define the publication day (Thursday) and the day of the week of the input date return uk_tz.localize(datetime.combine(pub_date, time(19, 0)))
def publication_dates(start_date: date, end_date: date) -> list[Event]:
"""List of Economist publication dates."""
# Define the publication day (Thursday) and non-publication weeks
publication_day = 3 # Thursday (0 - Monday, 1 - Tuesday, ..., 6 - Sunday) publication_day = 3 # Thursday (0 - Monday, 1 - Tuesday, ..., 6 - Sunday)
current_day_of_week = input_date.weekday()
current_week_number = input_date.isocalendar().week
# Define the list of weeks when The Economist is not published # Define the list of weeks when The Economist is not published
non_publication_weeks = [26, 56] non_publication_weeks = [26, 52]
# Check if the input date is a publication day (Thursday) current_date = start_date
publication_dates = []
while current_date <= end_date:
if ( if (
current_day_of_week == publication_day current_date.weekday() == publication_day
and current_week_number not in non_publication_weeks and current_date.isocalendar().week not in non_publication_weeks
): ):
return input_date publication_dates.append(add_pub_time(current_date))
current_date += timedelta(days=1)
# Calculate the date for the next Thursday after the input date return [Event(name="economist", date=pub_date) for pub_date in publication_dates]
days_until_next_thursday = (publication_day - current_day_of_week + 7) % 7
next_thursday_date = input_date + timedelta(days=days_until_next_thursday)
# Check if the next Thursday falls in a non-publication week
while next_thursday_date.isocalendar().week in non_publication_weeks:
# If it does, add 7 days to find the next Thursday
next_thursday_date += timedelta(days=7)
return next_thursday_date

View file

@ -55,7 +55,7 @@
</head> </head>
{% set event_labels = { {% set event_labels = {
"next_economist": "The Economist", "economist": "The Economist",
"mothers_day": "Mothers' day", "mothers_day": "Mothers' day",
"fathers_day": "Fathers' day", "fathers_day": "Fathers' day",
"uk_financial_year_end": "End of financial year", "uk_financial_year_end": "End of financial year",