diff --git a/agenda/__init__.py b/agenda/__init__.py
index 98f8a38..021fdba 100644
--- a/agenda/__init__.py
+++ b/agenda/__init__.py
@@ -152,10 +152,33 @@ def get_gbpusd() -> Decimal:
     return typing.cast(Decimal, 1 / data["quotes"]["USDGBP"])
 
 
-def next_economist() -> date:
+def next_economist(input_date: date) -> date:
     """Next date that the Economist is published."""
-    # TODO: handle the Christmas double issue correctly
-    return today + timedelta((3 - today.weekday()) % 7)
+    # Define the publication day (Thursday) and the day of the week of the input date
+    publication_day = 3  # Thursday (0 - Monday, 1 - Tuesday, ..., 6 - Sunday)
+    current_day_of_week = input_date.weekday()
+    current_week_number = today.isocalendar().week
+
+    # Define the list of weeks when The Economist is not published
+    non_publication_weeks = [26, 56]
+
+    # Check if the input date is a publication day (Thursday)
+    if (
+        current_day_of_week == publication_day
+        and current_week_number not in non_publication_weeks
+    ):
+        return input_date
+
+    # Calculate the date for the next Thursday after the input date
+    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
 
 
 def timedelta_display(delta: timedelta) -> str:
@@ -225,7 +248,7 @@ def get_data() -> dict[str, str | object]:
     reply = {
         "now": now,
         "gbpusd": get_gbpusd(),
-        "next_economist": next_economist(),
+        "next_economist": next_economist(today),
         "bank_holiday": get_next_bank_holiday(),
         "us_holiday": get_us_holiday(),
         "next_uk_general_election": next_uk_general_election,