diff --git a/src/core/models/conference.py b/src/core/models/conference.py
index b84c50cb0048857d7e9ad66f6cc09ba484b5936f..737006da6d667fd7cc3919195237f71645eeffd3 100644
--- a/src/core/models/conference.py
+++ b/src/core/models/conference.py
@@ -440,6 +440,13 @@ class Conference(models.Model):
         days[-1].end = end
         return days
 
+    def day(self, official_number: int) -> 'ConferenceDay':
+        """Returns the n-th day of the conference, starting with 1."""
+        for day in self.days:
+            if day.index == official_number:
+                return day
+        return None
+
     @cached_property
     def _day0(self) -> datetime:
         if self.start is None:
@@ -681,7 +688,7 @@ class ConferenceDay:
         return self.index == value.index and self.start == value.start and self.end == value.end
 
     def __repr__(self):
-        return f'{self.index} ({self.start.date()} - {self.end.date()})'
+        return f'{self.index} ({self.start} - {self.end})'
 
 
 class ConferenceExportCache(models.Model):
diff --git a/src/plainui/jinja2/plainui/fahrplan.html.j2 b/src/plainui/jinja2/plainui/fahrplan.html.j2
index 68955ffcb129ac117fd034e77c360748bd8f75e1..1e2b05bfc66fc9e4d9449a48933263cce1c7b34a 100644
--- a/src/plainui/jinja2/plainui/fahrplan.html.j2
+++ b/src/plainui/jinja2/plainui/fahrplan.html.j2
@@ -40,7 +40,7 @@
   <form method="get" action="#now" class="hub-card mb-2">
     <input type="hidden" name="mode" value="{{ mode }}">
     {% if show_assembly_filters %}<input type="hidden" name="show_assembly_filters" value="y">{% endif %}
-    {% if day %}<input type="hidden" name="day" value="{{ day }}">{% endif %}
+    {% if day %}<input type="hidden" name="day" value="{{ day.index }}">{% endif %}
     {% if kind %}<input type="hidden" name="kind" value="{{ kind }}">{% endif %}
     {% if assembly %}<input type="hidden" name="assembly" value="{{ assembly.slug }}">{% endif %}
     {% if track %}<input type="hidden" name="track" value="{{ track.slug }}">{% endif %}
@@ -78,8 +78,8 @@
     </div>
 
     <div class="hub-tags mb-2">
-      {% for n in range(days) %}
-        {{ filter_button('d' ~ (n if n != day else '') , n == day, _("Day %(n)s", n=n + 1)) }}
+      {% for d in days %}
+        {{ filter_button('d' ~ (d.index if d != day else '') , d == day, _("Day %(n)s", n=d.index)) }}
       {%- endfor %}
 
       <div class="hub-tag-divider"></div>
diff --git a/src/plainui/views/fahrplan.py b/src/plainui/views/fahrplan.py
index a1b79f94b30dbc440cf91bdf8e0af0df4ce6188d..39b247bbcc8e5b93fd031823e12b4077ed908667 100644
--- a/src/plainui/views/fahrplan.py
+++ b/src/plainui/views/fahrplan.py
@@ -3,7 +3,7 @@ __all__ = (
     'PublicFahrplanView',
 )
 
-from datetime import datetime, timedelta
+from datetime import datetime
 
 from django.http import Http404
 from django.utils import timezone
@@ -37,15 +37,10 @@ class FahrplanView(ConferenceRequiredMixin, TemplateView):
 
         context['my_favorite_events'] = session_get_favorite_events(self.request.session, self.request.user)
 
-        min_date = self.conf.start
-        max_date = self.conf.end
-        if min_date is None or max_date is None:
+        if self.conf.days_count == 0:
             raise Http404
-        n_days = (max_date - min_date).days
-        if (max_date - min_date) != timedelta(n_days):
-            n_days += 1
 
-        context['days'] = n_days
+        context['days'] = self.conf.days
         mode = self.request.GET.get('mode', 'calendar')
         day = self.request.GET.get('day', None)
         kind = self.request.GET.get('kind', 'official')
@@ -100,13 +95,11 @@ class FahrplanView(ConferenceRequiredMixin, TemplateView):
         if day:
             try:
                 day = int(day)
-                if day < 0 or day >= n_days:
-                    day = None
             except ValueError:
                 day = None
         else:
             day = None
-        context['day'] = day
+        context['day'] = self.conf.day(day) if day else None
 
         if kind == 'all':
             public_fahrplan = None
diff --git a/src/plainui/views/utils.py b/src/plainui/views/utils.py
index df4f9decff92c37c197cd5d605069a1025863280..6e19387aeb2e8591f8bad5731c3414c4ed267e8b 100644
--- a/src/plainui/views/utils.py
+++ b/src/plainui/views/utils.py
@@ -198,8 +198,12 @@ def event_filter(
 
     filters = {}
     if day is not None:
-        filters['schedule_start__gte'] = min_date + timedelta(day)
-        filters['schedule_start__lt'] = min_date + timedelta(day + 1)
+        if conf_day := conf.day(day):
+            filters['schedule_start__gte'] = conf_day.start
+            filters['schedule_start__lt'] = conf_day.end
+        else:
+            # an invalid day has been specified so there can't be any events by definition
+            return Event.objects.none()
     if kinds is not None:
         filters['kind__in'] = kinds
     if assembly: