{"id":88,"date":"2025-01-09T12:55:41","date_gmt":"2025-01-09T12:55:41","guid":{"rendered":"https:\/\/dover-dunkirk.com\/de\/vaartijden\/"},"modified":"2026-09-28T19:49:15","modified_gmt":"2026-09-28T19:49:15","slug":"fahrzeiten","status":"publish","type":"page","link":"https:\/\/dover-dunkirk.com\/de\/fahrzeiten\/","title":{"rendered":"Fahrzeiten D\u00fcnkirchen nach Dover"},"content":{"rendered":"\n<div class=\"dd-hero dd-hero--page\"><img fetchpriority=\"high\" src=\"https:\/\/dover-dunkirk.com\/de\/wp-content\/uploads\/sites\/2\/2026\/09\/delft-seaways-bow-loading-ramp.webp\" alt=\"Die Delft Seaways am Anleger in Loon-Plage mit heruntergelassener Rampe\" width=\"1400\" height=\"1050\" fetchpriority=\"high\" decoding=\"async\"><\/div><div class=\"dd-wrap\">\n\t<div class=\"dd-page-head dd-page-head--card\">\n\t\t<h1>Fahrzeiten D\u00fcnkirchen nach Dover<\/h1>\n\t\t<p class=\"dd-lede\">DFDS f\u00e4hrt alle zwei Stunden, Tag und Nacht, in beide Richtungen. Unten stehen die Abfahrten von heute, der Fahrplan f\u00fcr die kommende Woche und die Zeiten, zu denen der Check-in schlie\u00dft. Abfahrtszeiten sind in der Ortszeit des Abfahrtshafens angegeben.<\/p>\n\t\t<div class=\"dd-meta\"><span class=\"dd-updated\"><svg class=\"dd-ic\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M12 7v5l3 2\"\/><\/svg>Aktualisiert 28 September 2026<\/span><span class=\"dd-small dd-muted\">Quelle: DFDS-Fahrplan \u00fcber DirectFerries, jede Minute aktualisiert<\/span><\/div>\n\t<\/div>\n\n\t<div class=\"dd-page\">\n\t\t<div class=\"dd-main\">\n\t\t\t<section id=\"heute\">\n\t\t\t\t<h2>Abfahrten heute<\/h2>\n\t\t\t\t<p>Beide Richtungen, mit der Uhrzeit, zu der der Check-in schlie\u00dft. Alle Zeiten in der Ortszeit des jeweiligen Hafens.<\/p>\n\t\t\t\t<section class=\"dd-board dd-board--full\" aria-label=\"Abfahrten heute\"><div class=\"dd-board__head\"><p class=\"dd-board__title\">Abfahrten heute<\/p><span class=\"dd-board__live\"><i><\/i>Live <span class=\"dd-board__upd\">\u00b7 aktualisiert 00:55<\/span><\/span><\/div><div class=\"dd-board__clocks\"><div class=\"dd-board__clock\" data-tz=\"Europe\/Paris\"><span class=\"dd-board__port\">D\u00fcnkirchen<\/span><span class=\"dd-board__time dd-num\" data-dd-clock>01:55<\/span><span class=\"dd-board__zone\" data-dd-zone>CEST<\/span><\/div><div class=\"dd-board__mid\">2 Std. auf See<br>Frankreich +1 Std.<\/div><div class=\"dd-board__clock is-right\" data-tz=\"Europe\/London\"><span class=\"dd-board__port\">Dover<\/span><span class=\"dd-board__time dd-num\" data-dd-clock>00:55<\/span><span class=\"dd-board__zone\" data-dd-zone>BST<\/span><\/div><\/div><div class=\"dd-board__pane is-on\" id=\"dd-pane-99\" role=\"tabpanel\" aria-labelledby=\"dd-tab-99\"><h3 class=\"dd-board__pane-title\">D\u00fcnkirchen \u2192 Dover<\/h3><table class=\"dd-board__table\"><thead><tr><th>Abfahrt<\/th><th>Ankunft<\/th><th>Check-in bis<\/th><th><\/th><\/tr><\/thead><tbody><tr class=\"is-next\"><td class=\"dd-board__dep dd-num\">04:00<\/td><td class=\"dd-board__arr dd-num\">05:00<\/td><td class=\"dd-board__chk dd-num\">03:00<\/td><td class=\"dd-board__st\"><span class=\"dd-pill dd-pill--next\"><i><\/i>N\u00e4chste<\/span><\/td><\/tr><tr><td class=\"dd-board__dep dd-num\">06:00<\/td><td class=\"dd-board__arr dd-num\">07:00<\/td><td class=\"dd-board__chk dd-num\">05:00<\/td><td class=\"dd-board__st\"><\/td><\/tr><tr><td class=\"dd-board__dep dd-num\">08:00<\/td><td class=\"dd-board__arr dd-num\">09:00<\/td><td class=\"dd-board__chk dd-num\">07:00<\/td><td class=\"dd-board__st\"><\/td><\/tr><tr><td class=\"dd-board__dep dd-num\">10:00<\/td><td class=\"dd-board__arr dd-num\">11:00<\/td><td class=\"dd-board__chk dd-num\">09:00<\/td><td class=\"dd-board__st\"><\/td><\/tr><tr><td class=\"dd-board__dep dd-num\">12:00<\/td><td class=\"dd-board__arr dd-num\">13:00<\/td><td class=\"dd-board__chk dd-num\">11:00<\/td><td class=\"dd-board__st\"><\/td><\/tr><tr><td class=\"dd-board__dep dd-num\">14:00<\/td><td class=\"dd-board__arr dd-num\">15:00<\/td><td class=\"dd-board__chk dd-num\">13:00<\/td><td class=\"dd-board__st\"><\/td><\/tr><tr><td class=\"dd-board__dep dd-num\">16:00<\/td><td class=\"dd-board__arr dd-num\">17:00<\/td><td class=\"dd-board__chk dd-num\">15:00<\/td><td class=\"dd-board__st\"><\/td><\/tr><tr><td class=\"dd-board__dep dd-num\">18:00<\/td><td class=\"dd-board__arr dd-num\">19:00<\/td><td class=\"dd-board__chk dd-num\">17:00<\/td><td class=\"dd-board__st\"><\/td><\/tr><tr><td class=\"dd-board__dep dd-num\">20:00<\/td><td class=\"dd-board__arr dd-num\">21:00<\/td><td class=\"dd-board__chk dd-num\">19:00<\/td><td class=\"dd-board__st\"><\/td><\/tr><tr><td class=\"dd-board__dep dd-num\">23:59<\/td><td class=\"dd-board__arr dd-num\">00:59<\/td><td class=\"dd-board__chk dd-num\">22:59<\/td><td class=\"dd-board__st\"><\/td><\/tr><\/tbody><\/table><\/div><div class=\"dd-board__pane\" id=\"dd-pane-100\" role=\"tabpanel\" aria-labelledby=\"dd-tab-100\"><h3 class=\"dd-board__pane-title\">Dover \u2192 D\u00fcnkirchen<\/h3><table class=\"dd-board__table\"><thead><tr><th>Abfahrt<\/th><th>Ankunft<\/th><th>Check-in bis<\/th><th><\/th><\/tr><\/thead><tbody><tr class=\"is-next\"><td class=\"dd-board__dep dd-num\">06:00<\/td><td class=\"dd-board__arr dd-num\">09:00<\/td><td class=\"dd-board__chk dd-num\">05:00<\/td><td class=\"dd-board__st\"><span class=\"dd-pill dd-pill--next\"><i><\/i>N\u00e4chste<\/span><\/td><\/tr><tr><td class=\"dd-board__dep dd-num\">08:00<\/td><td class=\"dd-board__arr dd-num\">11:00<\/td><td class=\"dd-board__chk dd-num\">07:00<\/td><td class=\"dd-board__st\"><\/td><\/tr><tr><td class=\"dd-board__dep dd-num\">10:00<\/td><td class=\"dd-board__arr dd-num\">13:00<\/td><td class=\"dd-board__chk dd-num\">09:00<\/td><td class=\"dd-board__st\"><\/td><\/tr><tr><td class=\"dd-board__dep dd-num\">12:00<\/td><td class=\"dd-board__arr dd-num\">15:00<\/td><td class=\"dd-board__chk dd-num\">11:00<\/td><td class=\"dd-board__st\"><\/td><\/tr><tr><td class=\"dd-board__dep dd-num\">14:00<\/td><td class=\"dd-board__arr dd-num\">17:00<\/td><td class=\"dd-board__chk dd-num\">13:00<\/td><td class=\"dd-board__st\"><\/td><\/tr><tr><td class=\"dd-board__dep dd-num\">16:00<\/td><td class=\"dd-board__arr dd-num\">19:00<\/td><td class=\"dd-board__chk dd-num\">15:00<\/td><td class=\"dd-board__st\"><\/td><\/tr><tr><td class=\"dd-board__dep dd-num\">18:00<\/td><td class=\"dd-board__arr dd-num\">21:00<\/td><td class=\"dd-board__chk dd-num\">17:00<\/td><td class=\"dd-board__st\"><\/td><\/tr><tr><td class=\"dd-board__dep dd-num\">20:00<\/td><td class=\"dd-board__arr dd-num\">23:00<\/td><td class=\"dd-board__chk dd-num\">19:00<\/td><td class=\"dd-board__st\"><\/td><\/tr><tr><td class=\"dd-board__dep dd-num\">22:00<\/td><td class=\"dd-board__arr dd-num\">01:00<\/td><td class=\"dd-board__chk dd-num\">21:00<\/td><td class=\"dd-board__st\"><\/td><\/tr><\/tbody><\/table><\/div><div class=\"dd-board__foot\"><span>Abfahrt in Ortszeit des Abfahrtshafens, Ankunft in Ortszeit des Ankunftshafens.<\/span><\/div><\/section>\n\t\t\t<\/section>\n\n\t\t\t<section id=\"woche\">\n\t\t\t\t<h2>Fahrplan der kommenden Woche: D\u00fcnkirchen nach Dover<\/h2>\n\t\t\t\t<p>Je Tag die Zahl der Abfahrten und die Abfahrtszeiten in franz\u00f6sischer Zeit. An Werktagen sind es meist zehn Abfahrten, am Wochenende weniger; die Nachtf\u00e4hre um 23:59 f\u00e4hrt nicht jeden Tag.<\/p>\n\t\t\t\t<div class=\"dd-panel dd-tw\"><table class=\"dd-table dd-week\"><thead><tr><th>Tag<\/th><th>Abfahrten<\/th><th>Abfahrtszeiten, Ortszeit<\/th><\/tr><\/thead><tbody><tr class=\"is-today\"><th scope=\"row\">Mo 5-10<\/th><td><span class=\"dd-week__n dd-num\">10<\/span><\/td><td class=\"dd-week__times\"><span class=\"dd-week__t dd-num\">04:00<\/span><span class=\"dd-week__t dd-num\">06:00<\/span><span class=\"dd-week__t dd-num\">08:00<\/span><span class=\"dd-week__t dd-num\">10:00<\/span><span class=\"dd-week__t dd-num\">12:00<\/span><span class=\"dd-week__t dd-num\">14:00<\/span><span class=\"dd-week__t dd-num\">16:00<\/span><span class=\"dd-week__t dd-num\">18:00<\/span><span class=\"dd-week__t dd-num\">20:00<\/span><span class=\"dd-week__t dd-num\">23:59<\/span><\/td><\/tr><tr><th scope=\"row\">Di 6-10<\/th><td><span class=\"dd-week__n dd-num\">10<\/span><\/td><td class=\"dd-week__times\"><span class=\"dd-week__t dd-num\">04:00<\/span><span class=\"dd-week__t dd-num\">06:00<\/span><span class=\"dd-week__t dd-num\">08:00<\/span><span class=\"dd-week__t dd-num\">10:00<\/span><span class=\"dd-week__t dd-num\">12:00<\/span><span class=\"dd-week__t dd-num\">14:00<\/span><span class=\"dd-week__t dd-num\">16:00<\/span><span class=\"dd-week__t dd-num\">18:00<\/span><span class=\"dd-week__t dd-num\">20:00<\/span><span class=\"dd-week__t dd-num\">23:59<\/span><\/td><\/tr><tr><th scope=\"row\">Mi 7-10<\/th><td><span class=\"dd-week__n dd-num\">10<\/span><\/td><td class=\"dd-week__times\"><span class=\"dd-week__t dd-num\">04:00<\/span><span class=\"dd-week__t dd-num\">06:00<\/span><span class=\"dd-week__t dd-num\">08:00<\/span><span class=\"dd-week__t dd-num\">10:00<\/span><span class=\"dd-week__t dd-num\">12:00<\/span><span class=\"dd-week__t dd-num\">14:00<\/span><span class=\"dd-week__t dd-num\">16:00<\/span><span class=\"dd-week__t dd-num\">18:00<\/span><span class=\"dd-week__t dd-num\">20:00<\/span><span class=\"dd-week__t dd-num\">23:59<\/span><\/td><\/tr><tr><th scope=\"row\">Do 8-10<\/th><td><span class=\"dd-week__n dd-num\">10<\/span><\/td><td class=\"dd-week__times\"><span class=\"dd-week__t dd-num\">04:00<\/span><span class=\"dd-week__t dd-num\">06:00<\/span><span class=\"dd-week__t dd-num\">08:00<\/span><span class=\"dd-week__t dd-num\">10:00<\/span><span class=\"dd-week__t dd-num\">12:00<\/span><span class=\"dd-week__t dd-num\">14:00<\/span><span class=\"dd-week__t dd-num\">16:00<\/span><span class=\"dd-week__t dd-num\">18:00<\/span><span class=\"dd-week__t dd-num\">20:00<\/span><span class=\"dd-week__t dd-num\">23:59<\/span><\/td><\/tr><tr><th scope=\"row\">Fr 9-10<\/th><td><span class=\"dd-week__n dd-num\">9<\/span><\/td><td class=\"dd-week__times\"><span class=\"dd-week__t dd-num\">04:00<\/span><span class=\"dd-week__t dd-num\">06:00<\/span><span class=\"dd-week__t dd-num\">08:00<\/span><span class=\"dd-week__t dd-num\">10:00<\/span><span class=\"dd-week__t dd-num\">12:00<\/span><span class=\"dd-week__t dd-num\">14:00<\/span><span class=\"dd-week__t dd-num\">16:00<\/span><span class=\"dd-week__t dd-num\">18:00<\/span><span class=\"dd-week__t dd-num\">20:00<\/span><\/td><\/tr><tr><th scope=\"row\">Sa 10-10<\/th><td><span class=\"dd-week__n dd-num\">8<\/span><\/td><td class=\"dd-week__times\"><span class=\"dd-week__t dd-num\">04:00<\/span><span class=\"dd-week__t dd-num\">06:00<\/span><span class=\"dd-week__t dd-num\">08:00<\/span><span class=\"dd-week__t dd-num\">10:00<\/span><span class=\"dd-week__t dd-num\">12:00<\/span><span class=\"dd-week__t dd-num\">14:00<\/span><span class=\"dd-week__t dd-num\">16:00<\/span><span class=\"dd-week__t dd-num\">20:00<\/span><\/td><\/tr><tr><th scope=\"row\">So 11-10<\/th><td><span class=\"dd-week__n dd-num\">7<\/span><\/td><td class=\"dd-week__times\"><span class=\"dd-week__t dd-num\">06:00<\/span><span class=\"dd-week__t dd-num\">10:00<\/span><span class=\"dd-week__t dd-num\">12:00<\/span><span class=\"dd-week__t dd-num\">14:00<\/span><span class=\"dd-week__t dd-num\">16:00<\/span><span class=\"dd-week__t dd-num\">18:00<\/span><span class=\"dd-week__t dd-num\">20:00<\/span><\/td><\/tr><\/tbody><\/table><\/div>\n\t\t\t<\/section>\n\n\t\t\t<section id=\"woche-zurueck\">\n\t\t\t\t<h2>Fahrplan der kommenden Woche: Dover nach D\u00fcnkirchen<\/h2>\n\t\t\t\t<p>Abfahrtszeiten in englischer Zeit. Rechnen Sie eine Stunde dazu f\u00fcr die Ankunftszeit in D\u00fcnkirchen.<\/p>\n\t\t\t\t<div class=\"dd-panel dd-tw\"><table class=\"dd-table dd-week\"><thead><tr><th>Tag<\/th><th>Abfahrten<\/th><th>Abfahrtszeiten, Ortszeit<\/th><\/tr><\/thead><tbody><tr class=\"is-today\"><th scope=\"row\">Mo 5-10<\/th><td><span class=\"dd-week__n dd-num\">9<\/span><\/td><td class=\"dd-week__times\"><span class=\"dd-week__t dd-num\">06:00<\/span><span class=\"dd-week__t dd-num\">08:00<\/span><span class=\"dd-week__t dd-num\">10:00<\/span><span class=\"dd-week__t dd-num\">12:00<\/span><span class=\"dd-week__t dd-num\">14:00<\/span><span class=\"dd-week__t dd-num\">16:00<\/span><span class=\"dd-week__t dd-num\">18:00<\/span><span class=\"dd-week__t dd-num\">20:00<\/span><span class=\"dd-week__t dd-num\">22:00<\/span><\/td><\/tr><tr><th scope=\"row\">Di 6-10<\/th><td><span class=\"dd-week__n dd-num\">10<\/span><\/td><td class=\"dd-week__times\"><span class=\"dd-week__t dd-num\">02:00<\/span><span class=\"dd-week__t dd-num\">06:00<\/span><span class=\"dd-week__t dd-num\">08:00<\/span><span class=\"dd-week__t dd-num\">10:00<\/span><span class=\"dd-week__t dd-num\">12:00<\/span><span class=\"dd-week__t dd-num\">14:00<\/span><span class=\"dd-week__t dd-num\">16:00<\/span><span class=\"dd-week__t dd-num\">18:00<\/span><span class=\"dd-week__t dd-num\">20:00<\/span><span class=\"dd-week__t dd-num\">22:00<\/span><\/td><\/tr><tr><th scope=\"row\">Mi 7-10<\/th><td><span class=\"dd-week__n dd-num\">10<\/span><\/td><td class=\"dd-week__times\"><span class=\"dd-week__t dd-num\">02:00<\/span><span class=\"dd-week__t dd-num\">06:00<\/span><span class=\"dd-week__t dd-num\">08:00<\/span><span class=\"dd-week__t dd-num\">10:00<\/span><span class=\"dd-week__t dd-num\">12:00<\/span><span class=\"dd-week__t dd-num\">14:00<\/span><span class=\"dd-week__t dd-num\">16:00<\/span><span class=\"dd-week__t dd-num\">18:00<\/span><span class=\"dd-week__t dd-num\">20:00<\/span><span class=\"dd-week__t dd-num\">22:00<\/span><\/td><\/tr><tr><th scope=\"row\">Do 8-10<\/th><td><span class=\"dd-week__n dd-num\">10<\/span><\/td><td class=\"dd-week__times\"><span class=\"dd-week__t dd-num\">02:00<\/span><span class=\"dd-week__t dd-num\">06:00<\/span><span class=\"dd-week__t dd-num\">08:00<\/span><span class=\"dd-week__t dd-num\">10:00<\/span><span class=\"dd-week__t dd-num\">12:00<\/span><span class=\"dd-week__t dd-num\">14:00<\/span><span class=\"dd-week__t dd-num\">16:00<\/span><span class=\"dd-week__t dd-num\">18:00<\/span><span class=\"dd-week__t dd-num\">20:00<\/span><span class=\"dd-week__t dd-num\">22:00<\/span><\/td><\/tr><tr><th scope=\"row\">Fr 9-10<\/th><td><span class=\"dd-week__n dd-num\">10<\/span><\/td><td class=\"dd-week__times\"><span class=\"dd-week__t dd-num\">02:00<\/span><span class=\"dd-week__t dd-num\">06:00<\/span><span class=\"dd-week__t dd-num\">08:00<\/span><span class=\"dd-week__t dd-num\">10:00<\/span><span class=\"dd-week__t dd-num\">12:00<\/span><span class=\"dd-week__t dd-num\">14:00<\/span><span class=\"dd-week__t dd-num\">16:00<\/span><span class=\"dd-week__t dd-num\">18:00<\/span><span class=\"dd-week__t dd-num\">20:00<\/span><span class=\"dd-week__t dd-num\">22:00<\/span><\/td><\/tr><tr><th scope=\"row\">Sa 10-10<\/th><td><span class=\"dd-week__n dd-num\">8<\/span><\/td><td class=\"dd-week__times\"><span class=\"dd-week__t dd-num\">06:00<\/span><span class=\"dd-week__t dd-num\">08:00<\/span><span class=\"dd-week__t dd-num\">10:00<\/span><span class=\"dd-week__t dd-num\">12:00<\/span><span class=\"dd-week__t dd-num\">14:00<\/span><span class=\"dd-week__t dd-num\">16:00<\/span><span class=\"dd-week__t dd-num\">18:00<\/span><span class=\"dd-week__t dd-num\">22:00<\/span><\/td><\/tr><tr><th scope=\"row\">So 11-10<\/th><td><span class=\"dd-week__n dd-num\">7<\/span><\/td><td class=\"dd-week__times\"><span class=\"dd-week__t dd-num\">08:00<\/span><span class=\"dd-week__t dd-num\">12:00<\/span><span class=\"dd-week__t dd-num\">14:00<\/span><span class=\"dd-week__t dd-num\">16:00<\/span><span class=\"dd-week__t dd-num\">18:00<\/span><span class=\"dd-week__t dd-num\">20:00<\/span><span class=\"dd-week__t dd-num\">22:00<\/span><\/td><\/tr><\/tbody><\/table><\/div>\n\t\t\t<\/section>\n\n\t\t\t<section id=\"datum\">\n\t\t\t\t<h2>Ein anderes Datum w\u00e4hlen<\/h2>\n\t\t\t\t<p>W\u00e4hlen Sie ein Datum und die Anzahl der Tage; die Zeiten kommen direkt aus dem Fahrplan. Den Preis f\u00fcr diesen Tag finden Sie unter <a href=\"https:\/\/dover-dunkirk.com\/de\/fahre-buchen\/\">Preise und Buchung<\/a>.<\/p>\n\t\t\t\t<h3>D\u00fcnkirchen nach Dover<\/h3>\n\t\t\t\t<div class=\"tp-wrap tp-theme-extended_cards tp-day-setup-modern\" data-config=\"{&quot;rest&quot;:&quot;https:\\\/\\\/dover-dunkirk.com\\\/de\\\/wp-json\\\/timetables-pro\\\/v1\\\/timetables&quot;,&quot;routes&quot;:[99],&quot;days&quot;:1,&quot;autoload&quot;:true,&quot;theme&quot;:&quot;extended_cards&quot;,&quot;daySetup&quot;:&quot;modern&quot;,&quot;limit10&quot;:false,&quot;routeLabels&quot;:{&quot;99&quot;:&quot;D\\u00fcnkirchen-Dover&quot;},&quot;opFilter&quot;:[&quot;6&quot;],&quot;labels&quot;:{&quot;ui_date&quot;:&quot;Datum&quot;,&quot;ui_days&quot;:&quot;Tage&quot;,&quot;ui_button&quot;:&quot;\\u00dcberfahrten anzeigen&quot;,&quot;status_idle&quot;:&quot;W\\u00e4hlen Sie ein Datum und klicken Sie auf \\u00dcberfahrten anzeigen&quot;,&quot;status_loading&quot;:&quot;Wird geladen...&quot;,&quot;status_empty&quot;:&quot;Keine \\u00dcberfahrten gefunden&quot;,&quot;status_found&quot;:&quot;%d \\u00dcberfahrten gefunden&quot;,&quot;th_date&quot;:&quot;Datum&quot;,&quot;th_dep&quot;:&quot;Abfahrt&quot;,&quot;th_arr&quot;:&quot;Ankunft&quot;,&quot;th_dur&quot;:&quot;Dauer&quot;,&quot;th_ship&quot;:&quot;Schiff&quot;,&quot;th_op&quot;:&quot;Betreiber&quot;,&quot;th_route&quot;:&quot;Route&quot;,&quot;wd_sun&quot;:&quot;SO&quot;,&quot;wd_mon&quot;:&quot;MO&quot;,&quot;wd_tue&quot;:&quot;DI&quot;,&quot;wd_wed&quot;:&quot;MI&quot;,&quot;wd_thu&quot;:&quot;DO&quot;,&quot;wd_fri&quot;:&quot;FR&quot;,&quot;wd_sat&quot;:&quot;SA&quot;,&quot;summary_footer_one&quot;:&quot;\\u00bb Alle %s Abfahrten im Fahrplan ansehen&quot;,&quot;summary_footer_two&quot;:&quot;\\u00bb Mehr Abfahrten von %1$s und %2$s im Fahrplan ansehen&quot;,&quot;summary_footer_generic&quot;:&quot;Weitere \\u00dcberfahrten im Fahrplan ansehen&quot;,&quot;summary_header&quot;:&quot;Die n\\u00e4chsten zwei Abfahrten:&quot;,&quot;summary_no_upcoming&quot;:&quot;Keine kommenden Abfahrten gefunden&quot;,&quot;more_link&quot;:&quot;Weitere \\u00dcberfahrten&quot;,&quot;more_departures_button&quot;:&quot;Weitere Abfahrten anzeigen&quot;,&quot;day_nav_previous&quot;:&quot;Vorherigen Tag anzeigen&quot;,&quot;day_nav_next&quot;:&quot;N\\u00e4chsten Tag anzeigen&quot;,&quot;day_nav_today&quot;:&quot;Heute anzeigen&quot;,&quot;day_nav_tomorrow&quot;:&quot;Morgen anzeigen&quot;,&quot;local_time_pair&quot;:&quot;Ortszeit Abfahrtshafen: %1$s \\\/ Ortszeit Ankunftshafen: %2$s&quot;,&quot;local_time_combined&quot;:&quot;Ortszeit Abfahrts- &amp; Ankunftshafen: %s&quot;,&quot;tag_often_booked&quot;:&quot;\\u2b50 Oft gebucht&quot;,&quot;tag_leaving_soon&quot;:&quot;\\ud83d\\udd34 Bald abfahrend&quot;,&quot;tag_currently_sailing&quot;:&quot;\\ud83d\\udfe2 Derzeit unterwegs&quot;,&quot;tag_arrived&quot;:&quot;\\u26ab Angekommen&quot;,&quot;tag_overnight&quot;:&quot;\\u00dcber Nacht&quot;},&quot;showLogo&quot;:true,&quot;activityBoosters&quot;:true,&quot;title&quot;:&quot;&quot;,&quot;shipMap&quot;:[],&quot;shipLinks&quot;:[],&quot;showShip&quot;:false,&quot;departurePort&quot;:&quot;Dunkirk&quot;,&quot;arrivalPort&quot;:&quot;Dover&quot;,&quot;departureTimezone&quot;:&quot;Europe\\\/Paris&quot;,&quot;arrivalTimezone&quot;:&quot;Europe\\\/London&quot;}\">\n  <div class=\"tp-controls\" role=\"group\" aria-label=\"Timetable controls\">\n    <div>\n      <label for=\"tp-date-ops\">Datum<\/label><br>\n      <input id=\"tp-date-ops\" class=\"tp-date\" type=\"date\" aria-label=\"Datum\">\n    <\/div>\n    <div class=\"tp-day-field\">\n      <label for=\"tp-range-ops\">Tage<\/label><br>\n      <select id=\"tp-range-ops\" class=\"tp-range\" aria-label=\"Tage\">\n        <option value=\"1\">1<\/option><option value=\"3\">3<\/option><option value=\"7\">7<\/option><option value=\"14\">14<\/option>\n      <\/select>\n    <\/div>\n    <div><button id=\"tp-load-ops\" class=\"tp-btn\">\u00dcberfahrten anzeigen<\/button><\/div>\n  <\/div>\n\n  <div class=\"tp-local-nav-row\">\n    <div class=\"tp-local-times\" id=\"tp-local-times-ops\" aria-live=\"polite\"><\/div>\n    <div class=\"tp-day-nav-host\"><\/div>\n  <\/div>\n\n  \n  <div id=\"tp-status-ops\" class=\"tp-muted\" aria-live=\"polite\">W\u00e4hlen Sie ein Datum und klicken Sie auf \u00dcberfahrten anzeigen<\/div>\n\n  <div id=\"tp-ops-results\"><\/div>\n\n  <div class=\"tp-loader\" aria-hidden=\"true\">\n    <div class=\"tp-loader-card\">\n      <div class=\"tp-spinner\" aria-hidden=\"true\"><\/div>\n      <div class=\"tp-loader-text\">Wird geladen...<\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\n(function(){\n  const wrap   = document.currentScript.previousElementSibling;\n  const cfg    = JSON.parse(wrap.getAttribute('data-config')||'{}');\n  const L      = cfg.labels||{};\n  const dateEl = wrap.querySelector('#tp-date-ops');\n  const daysEl = wrap.querySelector('#tp-range-ops');\n  const btn    = wrap.querySelector('#tp-load-ops');\n  const status = wrap.querySelector('#tp-status-ops');\n  const out    = wrap.querySelector('#tp-ops-results');\n  const loader = wrap.querySelector('.tp-loader');\n  const navHost = wrap.querySelector('.tp-day-nav-host');\n  const localTimesEl = wrap.querySelector('#tp-local-times-ops');\n\n  const showShip = (cfg.showShip !== false && cfg.showShip !== 0 && cfg.showShip !== '0');\n  const activityBoosters = !!cfg.activityBoosters;\n  const daySetup = (cfg.daySetup === 'modern') ? 'modern' : 'classic';\n  const limit10 = !!cfg.limit10;\n  let featuredKey = '';\n  let soonKey = '';\n  let revealAll = false;\n\n  if (daySetup === 'modern') {\n    const dayField = wrap.querySelector('.tp-day-field');\n    if (dayField) dayField.style.display = 'none';\n  }\n\n  dateEl.valueAsDate = new Date();\n  dateEl.min = new Date().toISOString().split('T')[0];\n  Array.from(daysEl.options).forEach(o=>{ if(parseInt(o.value,10)===parseInt(cfg.days||7,10)) o.selected=true; });\n\n  function pad(n){ return String(n).padStart(2,'0'); }\n  function iso(d){ return d.getFullYear()+'-'+pad(d.getMonth()+1)+'-'+pad(d.getDate()); }\n  function toLocal(s){ return new Date(s); }\n  function hhmm(d){ return d.toLocaleTimeString([], {hour:'2-digit', minute:'2-digit'}); }\n  function dShort(d){ return d.toLocaleDateString([], {day:'numeric', month:'short'}); }\n  function dur(m){ const h=Math.floor(m\/60), r=m%60; return r? (h+'h '+r+'m') : (h+'h'); }\n\n  const WD = [\n    L.wd_sun || 'SUN',\n    L.wd_mon || 'MON',\n    L.wd_tue || 'TUE',\n    L.wd_wed || 'WED',\n    L.wd_thu || 'THU',\n    L.wd_fri || 'FRI',\n    L.wd_sat || 'SAT'\n  ];\n\n  function setLoader(v){ loader.classList.toggle('show', !!v); loader.setAttribute('aria-hidden', v?'false':'true'); }\n\n  function formatZoneTime(tz){\n    if (!tz) return '--:--';\n    try {\n      return new Intl.DateTimeFormat([], {hour:'2-digit', minute:'2-digit', hour12:false, timeZone: tz}).format(new Date());\n    } catch (e) {\n      return '--:--';\n    }\n  }\n\n  function renderLocalTimes(){\n    if (!localTimesEl) return;\n    if (!cfg.departureTimezone || !cfg.arrivalTimezone) {\n      localTimesEl.textContent = '';\n      return;\n    }\n    const depTime = formatZoneTime(cfg.departureTimezone);\n    const arrTime = formatZoneTime(cfg.arrivalTimezone);\n    const pairTpl = L.local_time_pair || 'Departure Port Local Time: %1$s \/ Arrival Port Local Time: %2$s';\n    const combinedTpl = L.local_time_combined || 'Departure & Arrival Port Local Time: %s';\n    if (depTime === arrTime) {\n      localTimesEl.textContent = combinedTpl.replace('%s', depTime);\n      return;\n    }\n    localTimesEl.textContent = pairTpl.replace('%1$s', depTime).replace('%2$s', arrTime);\n  }\n\n  function setStatusInline(html){\n    let box = wrap.querySelector('.tp-controls-status');\n    if (!box) {\n      box = document.createElement('div');\n      box.className = 'tp-controls-status';\n      wrap.querySelector('.tp-controls').appendChild(box);\n    }\n    box.innerHTML = html || '';\n  }\n\n  function clearStatusInline(){\n    const box = wrap.querySelector('.tp-controls-status');\n    if (box) box.innerHTML = '';\n  }\n\n  function navHtml(){\n    if (daySetup !== 'modern') return '';\n    const base = new Date(dateEl.value || new Date());\n    const today = new Date();\n    const tomorrow = new Date(today);\n    tomorrow.setDate(today.getDate() + 1);\n    const isToday = base.toDateString() === today.toDateString();\nlet prevLabel = L.day_nav_previous || 'Show previous day';\nlet nextLabel = L.day_nav_next || 'Show next day';\nif (isToday) nextLabel = L.day_nav_tomorrow || 'Show tomorrow';\nif (base.toDateString() === tomorrow.toDateString()) prevLabel = L.day_nav_today || 'Show today';\n    return '<div class=\"tp-day-nav\">'\n      + (isToday ? '' : '<a href=\"#\" data-shift=\"-1\">'+prevLabel+'<\/a>')\n      + '<a href=\"#\" data-shift=\"1\">'+nextLabel+'<\/a>'\n      + '<\/div>';\n  }\n\n  function shiftDate(delta){\n    const base = new Date(dateEl.value || new Date());\n    base.setDate(base.getDate() + delta);\n    dateEl.value = iso(base);\n    load();\n  }\n\n  function moreButtonHtml(hiddenCount){\n    if (!limit10 || revealAll || hiddenCount <= 0) return '';\n    return '<div style=\"margin-top:12px;text-align:center\">'\n      + '<button type=\"button\" class=\"tp-btn tp-more-btn\">'+(L.more_departures_button || 'Show more departures')+' ('+hiddenCount+')<\/button>'\n      + '<\/div>';\n  }\n\n  function opCell(r){\n    const name = r.opName || ('Operator '+(r.opId||''));\n    const logo = (cfg.showLogo && r.opLogo) ? '<img decoding=\"async\" src=\"'+r.opLogo+'\" alt=\"'+name+'\"> ' : '';\n    const label = logo + '<span>'+name+'<\/span>';\n    return r.opLink ? '<a class=\"tp-op\" href=\"'+r.opLink+'\" target=\"_blank\" rel=\"nofollow noopener\">'+label+'<\/a>' : '<span class=\"tp-op\">'+label+'<\/span>';\n  }\n\n  function shipInfo(original){\n    const key = (original||'').toLowerCase().trim();\n    const label = (cfg.shipMap && cfg.shipMap[key]) || original || '';\n    const href  = (cfg.shipLinks && cfg.shipLinks[key]) || '';\n    return {label, href};\n  }\n\n  function shipBadge(original){\n    const s = shipInfo(original);\n    const badge = '<span class=\"tp-badge\">'+(s.label||'')+'<\/span>';\n    return s.href ? ('<a href=\"'+s.href+'\" target=\"_blank\" rel=\"nofollow noopener\">'+badge+'<\/a>') : badge;\n  }\n\n  function rowKey(r){\n    return [String(r.routeId||''), String(r.opId||''), String(+r.dep||0), String(+r.arr||0)].join('|');\n  }\n\n  function pickFeaturedKey(rows, avoidKey){\n    if (!activityBoosters || !rows.length) return '';\n    const routesSum = Array.isArray(cfg.routes) ? cfg.routes.reduce((acc, n)=>acc + (parseInt(n,10)||0), 0) : 0;\n    const dateSeed = parseInt(String(dateEl.value || '').replace(\/-\/g,''), 10) || 0;\n\n    let pool = rows;\n    if (avoidKey) {\n      const soonIdx = rows.findIndex(r => rowKey(r) === avoidKey);\n      if (soonIdx >= 0) {\n        const later = rows.slice(soonIdx + 1).filter(r => rowKey(r) !== avoidKey);\n        pool = later.length ? later : rows.filter(r => rowKey(r) !== avoidKey);\n      } else {\n        pool = rows.filter(r => rowKey(r) !== avoidKey);\n      }\n    }\n\n    if (!pool.length) return '';\n    const idx = Math.abs((routesSum + dateSeed + rows.length) % pool.length);\n    return rowKey(pool[idx]);\n  }\n\n  function pickSoonKey(rows){\n    if (!activityBoosters || !rows.length) return '';\n    const now = Date.now();\n    const todayStr = new Date(now).toDateString();\n    const firstUpcoming = rows.find(r => (r.dep instanceof Date) && r.dep.getTime() > now && r.dep.toDateString() === todayStr);\n    return firstUpcoming ? rowKey(firstUpcoming) : '';\n  }\n\n  function boostersFor(r){\n    if (!activityBoosters) return [];\n    const now = Date.now();\n    const depMs = (r.dep instanceof Date) ? r.dep.getTime() : 0;\n    const arrMs = (r.arr instanceof Date) ? r.arr.getTime() : 0;\n    const depIsToday = (r.dep instanceof Date) && (new Date(now).toDateString() === r.dep.toDateString());\n\n    if (depMs > 0 && arrMs > 0 && depMs <= now && arrMs > now) {\n      return [{cls:'tp-booster-sailing', text:(L.tag_currently_sailing || '\ud83d\udfe2 Currently sailing')}];\n    }\n    if (depIsToday && arrMs > 0 && arrMs <= now) {\n      return [{cls:'tp-booster-arrived', text:(L.tag_arrived || '\u26ab Arrived')}];\n    }\n    if (rowKey(r) === soonKey) return [{cls:'tp-booster-soon', text:(L.tag_leaving_soon || '\ud83d\udd34 Leaving soon')}];\n    if (r.dep && r.arr && r.dep.toDateString() !== r.arr.toDateString()) return [{cls:'tp-booster-overnight', text:(L.tag_overnight || 'Overnight')}];\n\n    return [];\n  }\n\n  function boostersHtml(r, floating){\n    const tags = boostersFor(r);\n    if (!tags.length) return '';\n    const cls = floating ? 'tp-boosters tp-boosters-float' : 'tp-boosters';\n    return '<div class=\"'+cls+'\">' + tags.map(t => '<span class=\"tp-booster '+t.cls+'\">'+boosterLabelHtml(t.text)+'<\/span>').join('') + '<\/div>';\n  }\n\n  function boosterLabelHtml(text){\n    return String(text || '').replace(\/^(\ud83d\udd34|\ud83d\udfe2|\u26ab|\u2b50)\\s*\/, '<span class=\"tp-booster-emoji\">$1<\/span>');\n  }\n\n  function routeTicketHtml(label){\n    const raw = String(label || '').trim();\n    if (!raw) return '';\n    if (cfg.theme !== 'small_cards') return escAttr(raw);\n    const parts = raw.split(\/\\s*[\\-\u2013]\\s*\/, 2);\n    if (parts.length < 2) return escAttr(raw);\n    return escAttr(parts[0]) + '<br>' + escAttr(parts[1]);\n  }\n\n  function escAttr(v){\n    return String(v||'').replace(\/[&<>\"']\/g, m => ({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[m]));\n  }\n\n  function bindRowLinks(){\n    if (cfg.theme !== 'max_clickouts') return;\n    out.querySelectorAll('tr.tp-row-link').forEach((row)=>{\n      row.setAttribute('role','link');\n      row.setAttribute('tabindex','0');\n      row.addEventListener('click', (e)=>{\n        if (e.target && e.target.closest('a')) return;\n        const href = row.getAttribute('data-row-link');\n        if (!href) return;\n        window.open(href, '_blank', 'noopener,noreferrer');\n      });\n      row.addEventListener('keydown', (e)=>{\n        if (e.key !== 'Enter' && e.key !== ' ') return;\n        e.preventDefault();\n        row.click();\n      });\n    });\n  }\n\n  function routeLabel(rid){\n    return (cfg.routeLabels && (cfg.routeLabels[String(rid)] || cfg.routeLabels[rid])) || String(rid);\n  }\n\n  function renderTable(rows){\n    const th = {date:L.th_date,dep:L.th_dep,arr:L.th_arr,dur:L.th_dur,ship:L.th_ship,route:L.th_route,op:L.th_op};\n\n    const headCells = [\n      '<th>'+th.date+'<\/th>',\n      '<th>'+th.dep+'<\/th>',\n      '<th>'+th.arr+'<\/th>',\n      '<th>'+th.dur+'<\/th>'\n    ];\n    if (showShip) {\n      headCells.push('<th>'+th.ship+'<\/th>');\n    }\n    headCells.push('<th>'+th.route+'<\/th>');\n    headCells.push('<th>'+th.op+'<\/th>');\n\n    let html = '<table class=\"tp-table\"><thead><tr>'+headCells.join('')+'<\/tr><\/thead><tbody>';\n    rows.forEach(r=>{\n      const dow = WD[r.dep.getDay()] || '';\n      const clickable = (cfg.theme === 'max_clickouts' && r.opLink);\n      const rowAttr = clickable ? (' class=\"tp-row-link\" data-row-link=\"'+escAttr(r.opLink)+'\"') : '';\n      const dateBoosters = (cfg.theme === 'max_clickouts') ? '' : boostersHtml(r, false);\n      const routeBoosters = (cfg.theme === 'max_clickouts') ? boostersHtml(r, false) : '';\n      const cells = [\n        '<td>'+dShort(r.dep)+' <span class=\"tp-day\">'+dow+'<\/span>'+dateBoosters+'<\/td>',\n        '<td>'+hhmm(r.dep)+'<\/td>',\n        '<td>'+hhmm(r.arr)+'<\/td>',\n        '<td>'+dur(r.min)+'<\/td>'\n      ];\n      if (showShip) {\n        cells.push('<td>'+shipBadge(r.ship)+'<\/td>');\n      }\n      cells.push('<td>'+routeBoosters+'<div>'+routeLabel(r.routeId)+'<\/div><\/td>');\n      cells.push('<td>'+opCell(r)+'<\/td>');\n      html += '<tr'+rowAttr+'>'+cells.join('')+'<\/tr>';\n    });\n    html += '<\/tbody><\/table>';\n    return html;\n  }\n\n  function renderCards(rows){\n    if (cfg.theme === 'extended_cards') {\n      return renderExtendedCards(rows);\n    }\n\n    let html = '<div class=\"tp-cardlist\">';\n    rows.forEach(r=>{\n      const dow   = WD[r.dep.getDay()] || '';\n      const times = hhmm(r.dep) + ' <span class=\"tp-arrow\">\u2192<\/span> ' + hhmm(r.arr);\n      html += '<div class=\"tp-card\">'+boostersHtml(r, true)+\n        \/\/ Row 1: Date + weekday + times\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\"><span class=\"tp-sub\">'+dShort(r.dep)+'<\/span><span class=\"tp-day\">'+dow+'<\/span><\/div>'+\n          '<div class=\"rhs\"><span class=\"tp-time\">'+times+'<\/span><\/div>'+\n        '<\/div>';\n\n      if (showShip) {\n        html +=\n        \/\/ Row 2: Ship\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\">'+shipBadge(r.ship)+'<\/div>'+\n          '<div class=\"rhs\"><\/div>'+\n        '<\/div>';\n      }\n\n      html +=\n        \/\/ Row 3: Operator + route label\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\">'+opCell(r)+'<\/div>'+\n          '<div class=\"rhs\"><span class=\"tp-route-ticket\">'+routeTicketHtml(routeLabel(r.routeId))+'<\/span><\/div>'+\n        '<\/div>'+\n      '<\/div>';\n    });\n    html += '<\/div>';\n    return html;\n  }\n\n  function renderExtendedCards(rows){\n    const ctaText = L.more_link || 'More sailings';\n    let html = '<div class=\"tp-cardlist\">';\n    rows.forEach(r=>{\n      const dow = WD[r.dep.getDay()] || '';\n      const link = r.opLink ? ('<a class=\"tp-ext-cta\" href=\"'+r.opLink+'\" target=\"_blank\" rel=\"nofollow noopener\">'+ctaText+' <span class=\"tp-ext-cta-arrow\">\u00bb<\/span><\/a>') : '<span class=\"tp-ext-cta\">'+ctaText+' <span class=\"tp-ext-cta-arrow\">\u00bb<\/span><\/span>';\n      html += '<div class=\"tp-ext-card\">'\n        + boostersHtml(r, true)\n        + '<div class=\"tp-ext-left\">'\n        +   '<div>'+opCell(r)+'<\/div>'\n        +   (showShip ? ('<div>'+shipBadge(r.ship)+'<\/div>') : '')\n        + '<\/div>'\n        + '<div class=\"tp-ext-mid\">'\n        +   '<div class=\"tp-ext-top\"><span class=\"tp-sub\">'+dShort(r.dep)+' <span class=\"tp-day\">'+dow+'<\/span><\/span><span class=\"tp-ext-dur\">'+dur(r.min)+'<\/span><\/div>'\n        +   '<div class=\"tp-ext-times\"><span class=\"tp-ext-time\">'+hhmm(r.dep)+'<\/span><span class=\"tp-ext-line\"><\/span><span class=\"tp-ext-dur\">'+dur(r.min)+'<\/span><span class=\"tp-ext-line\"><\/span><span class=\"tp-ext-time\">'+hhmm(r.arr)+'<\/span><\/div>'\n        +   '<div class=\"tp-ext-route\">'+routeLabel(r.routeId)+'<\/div>'\n        + '<\/div>'\n        + '<div class=\"tp-ext-right\">'+link+'<\/div>'\n        + '<\/div>';\n    });\n    html += '<\/div>';\n    return html;\n  }\n\n  \/\/ Safe fetch helper\n  async function fetchOne(routeId, from, to){\n    try{\n      const url = new URL(cfg.rest);\n      url.searchParams.set('route', String(routeId));\n      url.searchParams.set('from', from);\n      url.searchParams.set('to', to);\n      const res = await fetch(url.toString(), {credentials:'same-origin'});\n      if(!res.ok) return { rid: routeId, error: 'HTTP '+res.status };\n      const json = await res.json();\n      const list = (json && json.data && Array.isArray(json.data.rows)) ? json.data.rows : [];\n      return { rid: routeId, rows: list };\n    }catch(e){\n      return { rid: routeId, error: String(e && e.message ? e.message : e) };\n    }\n  }\n\n  async function load(){\n    btn.disabled = true; setLoader(true); status.textContent = L.status_loading;\n\n    const start = new Date(dateEl.value || new Date());\n    const days  = (daySetup === 'modern') ? 1 : Math.max(1, parseInt(daysEl.value,10)||1);\n    const end   = new Date(start); end.setDate(start.getDate()+days-1);\n    const fromIso = iso(start), toIso = iso(end);\n\n    try{\n      const results  = await Promise.all((cfg.routes||[]).map(rid=>fetchOne(rid, fromIso, toIso)));\n      const oks  = results.filter(r => !r.error);\n      const errs = results.filter(r =>  r.error);\n\n      const all = [];\n      oks.forEach(({rid, rows})=>{\n        rows.forEach(t=>{\n          all.push({\n            routeId: rid,\n            opId: t.operatorId || null,\n            opName: t.operatorName || '',\n            opLogo: t.operatorLogo || '',\n            opLink: t.operatorLink || '',\n            dep: toLocal(t.departureTime),\n            arr: toLocal(t.arrivalTime),\n            min: t.durationInMinutes || 0,\n            ship: t.shipName || ''\n          });\n        });\n      });\n\n      let rows = all;\n      if (Array.isArray(cfg.opFilter) && cfg.opFilter.length>0) {\n        rows = all.filter(r => r.opId && cfg.opFilter.includes(String(r.opId)));\n      }\n\n      rows.sort((a,b)=> a.dep - b.dep);\n\n      const todayStr = new Date().toDateString();\n      const nowMs = Date.now();\n      const arrivedToday = rows\n        .filter(r => (r.dep instanceof Date) && (r.arr instanceof Date) && r.dep.toDateString() === todayStr && r.arr.getTime() <= nowMs)\n        .sort((a,b) => b.arr - a.arr);\n      if (arrivedToday.length > 2) {\n        const keep = new Set(arrivedToday.slice(0,2).map(rowKey));\n        rows = rows.filter(r => {\n          const isArrivedToday = (r.dep instanceof Date) && (r.arr instanceof Date) && r.dep.toDateString() === todayStr && r.arr.getTime() <= nowMs;\n          return !isArrivedToday || keep.has(rowKey(r));\n        });\n      }\n\n      const total = rows.length;\n      if (total===0){\n        status.textContent = L.status_empty + (errs.length ? ' (some routes returned no data or errors)' : '');\n        clearStatusInline();\n        out.innerHTML='';\n        setLoader(false); btn.disabled=false; return;\n      }\n\n      const visibleRows = (limit10 && !revealAll && rows.length > 10) ? rows.slice(0,10) : rows;\n      const hiddenCount = rows.length - visibleRows.length;\n      soonKey = pickSoonKey(visibleRows);\n      featuredKey = pickFeaturedKey(visibleRows, soonKey);\n\n      status.textContent = errs.length ? ('Skipped '+errs.length+' route'+(errs.length>1?'s':'')) : '';\n      setStatusInline(\n  (L.status_found || '%d sailings found').replace('%d', '<strong>'+total+'<\/strong>')\n);\n      out.innerHTML = renderTable(visibleRows) + renderCards(visibleRows) + moreButtonHtml(hiddenCount);\n      bindRowLinks();\n      if (navHost) navHost.innerHTML = navHtml();\n\n    } catch(e){\n      status.textContent = 'Failed to load data';\n      out.innerHTML = '<pre>'+String(e.message||e)+'<\/pre>';\n    } finally {\n      setLoader(false);\n      btn.disabled = false;\n    }\n  }\n\n  wrap.addEventListener('click', function(e){\n    const nav = e.target.closest('.tp-day-nav a[data-shift]');\n    if (nav) {\n      e.preventDefault();\n      shiftDate(parseInt(nav.getAttribute('data-shift'),10) || 0);\n      return;\n    }\n    const more = e.target.closest('.tp-more-btn');\n    if (more) {\n      e.preventDefault();\n      revealAll = true;\n      load();\n    }\n  });\n\n  btn.addEventListener('click', load);\n  if (navHost) navHost.innerHTML = navHtml();\n  renderLocalTimes();\n  setInterval(renderLocalTimes, 30000);\n  if (cfg.autoload) load();\n})();\n<\/script>\n\n\t\t\t\t<h3>Dover nach D\u00fcnkirchen<\/h3>\n\t\t\t\t<div class=\"tp-wrap tp-theme-extended_cards tp-day-setup-modern\" data-config=\"{&quot;rest&quot;:&quot;https:\\\/\\\/dover-dunkirk.com\\\/de\\\/wp-json\\\/timetables-pro\\\/v1\\\/timetables&quot;,&quot;routes&quot;:[100],&quot;days&quot;:1,&quot;autoload&quot;:true,&quot;theme&quot;:&quot;extended_cards&quot;,&quot;daySetup&quot;:&quot;modern&quot;,&quot;limit10&quot;:false,&quot;routeLabels&quot;:{&quot;100&quot;:&quot;Dover-D\\u00fcnkirchen&quot;},&quot;opFilter&quot;:[&quot;6&quot;],&quot;labels&quot;:{&quot;ui_date&quot;:&quot;Datum&quot;,&quot;ui_days&quot;:&quot;Tage&quot;,&quot;ui_button&quot;:&quot;\\u00dcberfahrten anzeigen&quot;,&quot;status_idle&quot;:&quot;W\\u00e4hlen Sie ein Datum und klicken Sie auf \\u00dcberfahrten anzeigen&quot;,&quot;status_loading&quot;:&quot;Wird geladen...&quot;,&quot;status_empty&quot;:&quot;Keine \\u00dcberfahrten gefunden&quot;,&quot;status_found&quot;:&quot;%d \\u00dcberfahrten gefunden&quot;,&quot;th_date&quot;:&quot;Datum&quot;,&quot;th_dep&quot;:&quot;Abfahrt&quot;,&quot;th_arr&quot;:&quot;Ankunft&quot;,&quot;th_dur&quot;:&quot;Dauer&quot;,&quot;th_ship&quot;:&quot;Schiff&quot;,&quot;th_op&quot;:&quot;Betreiber&quot;,&quot;th_route&quot;:&quot;Route&quot;,&quot;wd_sun&quot;:&quot;SO&quot;,&quot;wd_mon&quot;:&quot;MO&quot;,&quot;wd_tue&quot;:&quot;DI&quot;,&quot;wd_wed&quot;:&quot;MI&quot;,&quot;wd_thu&quot;:&quot;DO&quot;,&quot;wd_fri&quot;:&quot;FR&quot;,&quot;wd_sat&quot;:&quot;SA&quot;,&quot;summary_footer_one&quot;:&quot;\\u00bb Alle %s Abfahrten im Fahrplan ansehen&quot;,&quot;summary_footer_two&quot;:&quot;\\u00bb Mehr Abfahrten von %1$s und %2$s im Fahrplan ansehen&quot;,&quot;summary_footer_generic&quot;:&quot;Weitere \\u00dcberfahrten im Fahrplan ansehen&quot;,&quot;summary_header&quot;:&quot;Die n\\u00e4chsten zwei Abfahrten:&quot;,&quot;summary_no_upcoming&quot;:&quot;Keine kommenden Abfahrten gefunden&quot;,&quot;more_link&quot;:&quot;Weitere \\u00dcberfahrten&quot;,&quot;more_departures_button&quot;:&quot;Weitere Abfahrten anzeigen&quot;,&quot;day_nav_previous&quot;:&quot;Vorherigen Tag anzeigen&quot;,&quot;day_nav_next&quot;:&quot;N\\u00e4chsten Tag anzeigen&quot;,&quot;day_nav_today&quot;:&quot;Heute anzeigen&quot;,&quot;day_nav_tomorrow&quot;:&quot;Morgen anzeigen&quot;,&quot;local_time_pair&quot;:&quot;Ortszeit Abfahrtshafen: %1$s \\\/ Ortszeit Ankunftshafen: %2$s&quot;,&quot;local_time_combined&quot;:&quot;Ortszeit Abfahrts- &amp; Ankunftshafen: %s&quot;,&quot;tag_often_booked&quot;:&quot;\\u2b50 Oft gebucht&quot;,&quot;tag_leaving_soon&quot;:&quot;\\ud83d\\udd34 Bald abfahrend&quot;,&quot;tag_currently_sailing&quot;:&quot;\\ud83d\\udfe2 Derzeit unterwegs&quot;,&quot;tag_arrived&quot;:&quot;\\u26ab Angekommen&quot;,&quot;tag_overnight&quot;:&quot;\\u00dcber Nacht&quot;},&quot;showLogo&quot;:true,&quot;activityBoosters&quot;:true,&quot;title&quot;:&quot;&quot;,&quot;shipMap&quot;:[],&quot;shipLinks&quot;:[],&quot;showShip&quot;:false,&quot;departurePort&quot;:&quot;Dover&quot;,&quot;arrivalPort&quot;:&quot;Dunkirk&quot;,&quot;departureTimezone&quot;:&quot;Europe\\\/London&quot;,&quot;arrivalTimezone&quot;:&quot;Europe\\\/Paris&quot;}\">\n  <div class=\"tp-controls\" role=\"group\" aria-label=\"Timetable controls\">\n    <div>\n      <label for=\"tp-date-ops\">Datum<\/label><br>\n      <input id=\"tp-date-ops\" class=\"tp-date\" type=\"date\" aria-label=\"Datum\">\n    <\/div>\n    <div class=\"tp-day-field\">\n      <label for=\"tp-range-ops\">Tage<\/label><br>\n      <select id=\"tp-range-ops\" class=\"tp-range\" aria-label=\"Tage\">\n        <option value=\"1\">1<\/option><option value=\"3\">3<\/option><option value=\"7\">7<\/option><option value=\"14\">14<\/option>\n      <\/select>\n    <\/div>\n    <div><button id=\"tp-load-ops\" class=\"tp-btn\">\u00dcberfahrten anzeigen<\/button><\/div>\n  <\/div>\n\n  <div class=\"tp-local-nav-row\">\n    <div class=\"tp-local-times\" id=\"tp-local-times-ops\" aria-live=\"polite\"><\/div>\n    <div class=\"tp-day-nav-host\"><\/div>\n  <\/div>\n\n  \n  <div id=\"tp-status-ops\" class=\"tp-muted\" aria-live=\"polite\">W\u00e4hlen Sie ein Datum und klicken Sie auf \u00dcberfahrten anzeigen<\/div>\n\n  <div id=\"tp-ops-results\"><\/div>\n\n  <div class=\"tp-loader\" aria-hidden=\"true\">\n    <div class=\"tp-loader-card\">\n      <div class=\"tp-spinner\" aria-hidden=\"true\"><\/div>\n      <div class=\"tp-loader-text\">Wird geladen...<\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\n(function(){\n  const wrap   = document.currentScript.previousElementSibling;\n  const cfg    = JSON.parse(wrap.getAttribute('data-config')||'{}');\n  const L      = cfg.labels||{};\n  const dateEl = wrap.querySelector('#tp-date-ops');\n  const daysEl = wrap.querySelector('#tp-range-ops');\n  const btn    = wrap.querySelector('#tp-load-ops');\n  const status = wrap.querySelector('#tp-status-ops');\n  const out    = wrap.querySelector('#tp-ops-results');\n  const loader = wrap.querySelector('.tp-loader');\n  const navHost = wrap.querySelector('.tp-day-nav-host');\n  const localTimesEl = wrap.querySelector('#tp-local-times-ops');\n\n  const showShip = (cfg.showShip !== false && cfg.showShip !== 0 && cfg.showShip !== '0');\n  const activityBoosters = !!cfg.activityBoosters;\n  const daySetup = (cfg.daySetup === 'modern') ? 'modern' : 'classic';\n  const limit10 = !!cfg.limit10;\n  let featuredKey = '';\n  let soonKey = '';\n  let revealAll = false;\n\n  if (daySetup === 'modern') {\n    const dayField = wrap.querySelector('.tp-day-field');\n    if (dayField) dayField.style.display = 'none';\n  }\n\n  dateEl.valueAsDate = new Date();\n  dateEl.min = new Date().toISOString().split('T')[0];\n  Array.from(daysEl.options).forEach(o=>{ if(parseInt(o.value,10)===parseInt(cfg.days||7,10)) o.selected=true; });\n\n  function pad(n){ return String(n).padStart(2,'0'); }\n  function iso(d){ return d.getFullYear()+'-'+pad(d.getMonth()+1)+'-'+pad(d.getDate()); }\n  function toLocal(s){ return new Date(s); }\n  function hhmm(d){ return d.toLocaleTimeString([], {hour:'2-digit', minute:'2-digit'}); }\n  function dShort(d){ return d.toLocaleDateString([], {day:'numeric', month:'short'}); }\n  function dur(m){ const h=Math.floor(m\/60), r=m%60; return r? (h+'h '+r+'m') : (h+'h'); }\n\n  const WD = [\n    L.wd_sun || 'SUN',\n    L.wd_mon || 'MON',\n    L.wd_tue || 'TUE',\n    L.wd_wed || 'WED',\n    L.wd_thu || 'THU',\n    L.wd_fri || 'FRI',\n    L.wd_sat || 'SAT'\n  ];\n\n  function setLoader(v){ loader.classList.toggle('show', !!v); loader.setAttribute('aria-hidden', v?'false':'true'); }\n\n  function formatZoneTime(tz){\n    if (!tz) return '--:--';\n    try {\n      return new Intl.DateTimeFormat([], {hour:'2-digit', minute:'2-digit', hour12:false, timeZone: tz}).format(new Date());\n    } catch (e) {\n      return '--:--';\n    }\n  }\n\n  function renderLocalTimes(){\n    if (!localTimesEl) return;\n    if (!cfg.departureTimezone || !cfg.arrivalTimezone) {\n      localTimesEl.textContent = '';\n      return;\n    }\n    const depTime = formatZoneTime(cfg.departureTimezone);\n    const arrTime = formatZoneTime(cfg.arrivalTimezone);\n    const pairTpl = L.local_time_pair || 'Departure Port Local Time: %1$s \/ Arrival Port Local Time: %2$s';\n    const combinedTpl = L.local_time_combined || 'Departure & Arrival Port Local Time: %s';\n    if (depTime === arrTime) {\n      localTimesEl.textContent = combinedTpl.replace('%s', depTime);\n      return;\n    }\n    localTimesEl.textContent = pairTpl.replace('%1$s', depTime).replace('%2$s', arrTime);\n  }\n\n  function setStatusInline(html){\n    let box = wrap.querySelector('.tp-controls-status');\n    if (!box) {\n      box = document.createElement('div');\n      box.className = 'tp-controls-status';\n      wrap.querySelector('.tp-controls').appendChild(box);\n    }\n    box.innerHTML = html || '';\n  }\n\n  function clearStatusInline(){\n    const box = wrap.querySelector('.tp-controls-status');\n    if (box) box.innerHTML = '';\n  }\n\n  function navHtml(){\n    if (daySetup !== 'modern') return '';\n    const base = new Date(dateEl.value || new Date());\n    const today = new Date();\n    const tomorrow = new Date(today);\n    tomorrow.setDate(today.getDate() + 1);\n    const isToday = base.toDateString() === today.toDateString();\nlet prevLabel = L.day_nav_previous || 'Show previous day';\nlet nextLabel = L.day_nav_next || 'Show next day';\nif (isToday) nextLabel = L.day_nav_tomorrow || 'Show tomorrow';\nif (base.toDateString() === tomorrow.toDateString()) prevLabel = L.day_nav_today || 'Show today';\n    return '<div class=\"tp-day-nav\">'\n      + (isToday ? '' : '<a href=\"#\" data-shift=\"-1\">'+prevLabel+'<\/a>')\n      + '<a href=\"#\" data-shift=\"1\">'+nextLabel+'<\/a>'\n      + '<\/div>';\n  }\n\n  function shiftDate(delta){\n    const base = new Date(dateEl.value || new Date());\n    base.setDate(base.getDate() + delta);\n    dateEl.value = iso(base);\n    load();\n  }\n\n  function moreButtonHtml(hiddenCount){\n    if (!limit10 || revealAll || hiddenCount <= 0) return '';\n    return '<div style=\"margin-top:12px;text-align:center\">'\n      + '<button type=\"button\" class=\"tp-btn tp-more-btn\">'+(L.more_departures_button || 'Show more departures')+' ('+hiddenCount+')<\/button>'\n      + '<\/div>';\n  }\n\n  function opCell(r){\n    const name = r.opName || ('Operator '+(r.opId||''));\n    const logo = (cfg.showLogo && r.opLogo) ? '<img decoding=\"async\" src=\"'+r.opLogo+'\" alt=\"'+name+'\"> ' : '';\n    const label = logo + '<span>'+name+'<\/span>';\n    return r.opLink ? '<a class=\"tp-op\" href=\"'+r.opLink+'\" target=\"_blank\" rel=\"nofollow noopener\">'+label+'<\/a>' : '<span class=\"tp-op\">'+label+'<\/span>';\n  }\n\n  function shipInfo(original){\n    const key = (original||'').toLowerCase().trim();\n    const label = (cfg.shipMap && cfg.shipMap[key]) || original || '';\n    const href  = (cfg.shipLinks && cfg.shipLinks[key]) || '';\n    return {label, href};\n  }\n\n  function shipBadge(original){\n    const s = shipInfo(original);\n    const badge = '<span class=\"tp-badge\">'+(s.label||'')+'<\/span>';\n    return s.href ? ('<a href=\"'+s.href+'\" target=\"_blank\" rel=\"nofollow noopener\">'+badge+'<\/a>') : badge;\n  }\n\n  function rowKey(r){\n    return [String(r.routeId||''), String(r.opId||''), String(+r.dep||0), String(+r.arr||0)].join('|');\n  }\n\n  function pickFeaturedKey(rows, avoidKey){\n    if (!activityBoosters || !rows.length) return '';\n    const routesSum = Array.isArray(cfg.routes) ? cfg.routes.reduce((acc, n)=>acc + (parseInt(n,10)||0), 0) : 0;\n    const dateSeed = parseInt(String(dateEl.value || '').replace(\/-\/g,''), 10) || 0;\n\n    let pool = rows;\n    if (avoidKey) {\n      const soonIdx = rows.findIndex(r => rowKey(r) === avoidKey);\n      if (soonIdx >= 0) {\n        const later = rows.slice(soonIdx + 1).filter(r => rowKey(r) !== avoidKey);\n        pool = later.length ? later : rows.filter(r => rowKey(r) !== avoidKey);\n      } else {\n        pool = rows.filter(r => rowKey(r) !== avoidKey);\n      }\n    }\n\n    if (!pool.length) return '';\n    const idx = Math.abs((routesSum + dateSeed + rows.length) % pool.length);\n    return rowKey(pool[idx]);\n  }\n\n  function pickSoonKey(rows){\n    if (!activityBoosters || !rows.length) return '';\n    const now = Date.now();\n    const todayStr = new Date(now).toDateString();\n    const firstUpcoming = rows.find(r => (r.dep instanceof Date) && r.dep.getTime() > now && r.dep.toDateString() === todayStr);\n    return firstUpcoming ? rowKey(firstUpcoming) : '';\n  }\n\n  function boostersFor(r){\n    if (!activityBoosters) return [];\n    const now = Date.now();\n    const depMs = (r.dep instanceof Date) ? r.dep.getTime() : 0;\n    const arrMs = (r.arr instanceof Date) ? r.arr.getTime() : 0;\n    const depIsToday = (r.dep instanceof Date) && (new Date(now).toDateString() === r.dep.toDateString());\n\n    if (depMs > 0 && arrMs > 0 && depMs <= now && arrMs > now) {\n      return [{cls:'tp-booster-sailing', text:(L.tag_currently_sailing || '\ud83d\udfe2 Currently sailing')}];\n    }\n    if (depIsToday && arrMs > 0 && arrMs <= now) {\n      return [{cls:'tp-booster-arrived', text:(L.tag_arrived || '\u26ab Arrived')}];\n    }\n    if (rowKey(r) === soonKey) return [{cls:'tp-booster-soon', text:(L.tag_leaving_soon || '\ud83d\udd34 Leaving soon')}];\n    if (r.dep && r.arr && r.dep.toDateString() !== r.arr.toDateString()) return [{cls:'tp-booster-overnight', text:(L.tag_overnight || 'Overnight')}];\n\n    return [];\n  }\n\n  function boostersHtml(r, floating){\n    const tags = boostersFor(r);\n    if (!tags.length) return '';\n    const cls = floating ? 'tp-boosters tp-boosters-float' : 'tp-boosters';\n    return '<div class=\"'+cls+'\">' + tags.map(t => '<span class=\"tp-booster '+t.cls+'\">'+boosterLabelHtml(t.text)+'<\/span>').join('') + '<\/div>';\n  }\n\n  function boosterLabelHtml(text){\n    return String(text || '').replace(\/^(\ud83d\udd34|\ud83d\udfe2|\u26ab|\u2b50)\\s*\/, '<span class=\"tp-booster-emoji\">$1<\/span>');\n  }\n\n  function routeTicketHtml(label){\n    const raw = String(label || '').trim();\n    if (!raw) return '';\n    if (cfg.theme !== 'small_cards') return escAttr(raw);\n    const parts = raw.split(\/\\s*[\\-\u2013]\\s*\/, 2);\n    if (parts.length < 2) return escAttr(raw);\n    return escAttr(parts[0]) + '<br>' + escAttr(parts[1]);\n  }\n\n  function escAttr(v){\n    return String(v||'').replace(\/[&<>\"']\/g, m => ({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[m]));\n  }\n\n  function bindRowLinks(){\n    if (cfg.theme !== 'max_clickouts') return;\n    out.querySelectorAll('tr.tp-row-link').forEach((row)=>{\n      row.setAttribute('role','link');\n      row.setAttribute('tabindex','0');\n      row.addEventListener('click', (e)=>{\n        if (e.target && e.target.closest('a')) return;\n        const href = row.getAttribute('data-row-link');\n        if (!href) return;\n        window.open(href, '_blank', 'noopener,noreferrer');\n      });\n      row.addEventListener('keydown', (e)=>{\n        if (e.key !== 'Enter' && e.key !== ' ') return;\n        e.preventDefault();\n        row.click();\n      });\n    });\n  }\n\n  function routeLabel(rid){\n    return (cfg.routeLabels && (cfg.routeLabels[String(rid)] || cfg.routeLabels[rid])) || String(rid);\n  }\n\n  function renderTable(rows){\n    const th = {date:L.th_date,dep:L.th_dep,arr:L.th_arr,dur:L.th_dur,ship:L.th_ship,route:L.th_route,op:L.th_op};\n\n    const headCells = [\n      '<th>'+th.date+'<\/th>',\n      '<th>'+th.dep+'<\/th>',\n      '<th>'+th.arr+'<\/th>',\n      '<th>'+th.dur+'<\/th>'\n    ];\n    if (showShip) {\n      headCells.push('<th>'+th.ship+'<\/th>');\n    }\n    headCells.push('<th>'+th.route+'<\/th>');\n    headCells.push('<th>'+th.op+'<\/th>');\n\n    let html = '<table class=\"tp-table\"><thead><tr>'+headCells.join('')+'<\/tr><\/thead><tbody>';\n    rows.forEach(r=>{\n      const dow = WD[r.dep.getDay()] || '';\n      const clickable = (cfg.theme === 'max_clickouts' && r.opLink);\n      const rowAttr = clickable ? (' class=\"tp-row-link\" data-row-link=\"'+escAttr(r.opLink)+'\"') : '';\n      const dateBoosters = (cfg.theme === 'max_clickouts') ? '' : boostersHtml(r, false);\n      const routeBoosters = (cfg.theme === 'max_clickouts') ? boostersHtml(r, false) : '';\n      const cells = [\n        '<td>'+dShort(r.dep)+' <span class=\"tp-day\">'+dow+'<\/span>'+dateBoosters+'<\/td>',\n        '<td>'+hhmm(r.dep)+'<\/td>',\n        '<td>'+hhmm(r.arr)+'<\/td>',\n        '<td>'+dur(r.min)+'<\/td>'\n      ];\n      if (showShip) {\n        cells.push('<td>'+shipBadge(r.ship)+'<\/td>');\n      }\n      cells.push('<td>'+routeBoosters+'<div>'+routeLabel(r.routeId)+'<\/div><\/td>');\n      cells.push('<td>'+opCell(r)+'<\/td>');\n      html += '<tr'+rowAttr+'>'+cells.join('')+'<\/tr>';\n    });\n    html += '<\/tbody><\/table>';\n    return html;\n  }\n\n  function renderCards(rows){\n    if (cfg.theme === 'extended_cards') {\n      return renderExtendedCards(rows);\n    }\n\n    let html = '<div class=\"tp-cardlist\">';\n    rows.forEach(r=>{\n      const dow   = WD[r.dep.getDay()] || '';\n      const times = hhmm(r.dep) + ' <span class=\"tp-arrow\">\u2192<\/span> ' + hhmm(r.arr);\n      html += '<div class=\"tp-card\">'+boostersHtml(r, true)+\n        \/\/ Row 1: Date + weekday + times\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\"><span class=\"tp-sub\">'+dShort(r.dep)+'<\/span><span class=\"tp-day\">'+dow+'<\/span><\/div>'+\n          '<div class=\"rhs\"><span class=\"tp-time\">'+times+'<\/span><\/div>'+\n        '<\/div>';\n\n      if (showShip) {\n        html +=\n        \/\/ Row 2: Ship\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\">'+shipBadge(r.ship)+'<\/div>'+\n          '<div class=\"rhs\"><\/div>'+\n        '<\/div>';\n      }\n\n      html +=\n        \/\/ Row 3: Operator + route label\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\">'+opCell(r)+'<\/div>'+\n          '<div class=\"rhs\"><span class=\"tp-route-ticket\">'+routeTicketHtml(routeLabel(r.routeId))+'<\/span><\/div>'+\n        '<\/div>'+\n      '<\/div>';\n    });\n    html += '<\/div>';\n    return html;\n  }\n\n  function renderExtendedCards(rows){\n    const ctaText = L.more_link || 'More sailings';\n    let html = '<div class=\"tp-cardlist\">';\n    rows.forEach(r=>{\n      const dow = WD[r.dep.getDay()] || '';\n      const link = r.opLink ? ('<a class=\"tp-ext-cta\" href=\"'+r.opLink+'\" target=\"_blank\" rel=\"nofollow noopener\">'+ctaText+' <span class=\"tp-ext-cta-arrow\">\u00bb<\/span><\/a>') : '<span class=\"tp-ext-cta\">'+ctaText+' <span class=\"tp-ext-cta-arrow\">\u00bb<\/span><\/span>';\n      html += '<div class=\"tp-ext-card\">'\n        + boostersHtml(r, true)\n        + '<div class=\"tp-ext-left\">'\n        +   '<div>'+opCell(r)+'<\/div>'\n        +   (showShip ? ('<div>'+shipBadge(r.ship)+'<\/div>') : '')\n        + '<\/div>'\n        + '<div class=\"tp-ext-mid\">'\n        +   '<div class=\"tp-ext-top\"><span class=\"tp-sub\">'+dShort(r.dep)+' <span class=\"tp-day\">'+dow+'<\/span><\/span><span class=\"tp-ext-dur\">'+dur(r.min)+'<\/span><\/div>'\n        +   '<div class=\"tp-ext-times\"><span class=\"tp-ext-time\">'+hhmm(r.dep)+'<\/span><span class=\"tp-ext-line\"><\/span><span class=\"tp-ext-dur\">'+dur(r.min)+'<\/span><span class=\"tp-ext-line\"><\/span><span class=\"tp-ext-time\">'+hhmm(r.arr)+'<\/span><\/div>'\n        +   '<div class=\"tp-ext-route\">'+routeLabel(r.routeId)+'<\/div>'\n        + '<\/div>'\n        + '<div class=\"tp-ext-right\">'+link+'<\/div>'\n        + '<\/div>';\n    });\n    html += '<\/div>';\n    return html;\n  }\n\n  \/\/ Safe fetch helper\n  async function fetchOne(routeId, from, to){\n    try{\n      const url = new URL(cfg.rest);\n      url.searchParams.set('route', String(routeId));\n      url.searchParams.set('from', from);\n      url.searchParams.set('to', to);\n      const res = await fetch(url.toString(), {credentials:'same-origin'});\n      if(!res.ok) return { rid: routeId, error: 'HTTP '+res.status };\n      const json = await res.json();\n      const list = (json && json.data && Array.isArray(json.data.rows)) ? json.data.rows : [];\n      return { rid: routeId, rows: list };\n    }catch(e){\n      return { rid: routeId, error: String(e && e.message ? e.message : e) };\n    }\n  }\n\n  async function load(){\n    btn.disabled = true; setLoader(true); status.textContent = L.status_loading;\n\n    const start = new Date(dateEl.value || new Date());\n    const days  = (daySetup === 'modern') ? 1 : Math.max(1, parseInt(daysEl.value,10)||1);\n    const end   = new Date(start); end.setDate(start.getDate()+days-1);\n    const fromIso = iso(start), toIso = iso(end);\n\n    try{\n      const results  = await Promise.all((cfg.routes||[]).map(rid=>fetchOne(rid, fromIso, toIso)));\n      const oks  = results.filter(r => !r.error);\n      const errs = results.filter(r =>  r.error);\n\n      const all = [];\n      oks.forEach(({rid, rows})=>{\n        rows.forEach(t=>{\n          all.push({\n            routeId: rid,\n            opId: t.operatorId || null,\n            opName: t.operatorName || '',\n            opLogo: t.operatorLogo || '',\n            opLink: t.operatorLink || '',\n            dep: toLocal(t.departureTime),\n            arr: toLocal(t.arrivalTime),\n            min: t.durationInMinutes || 0,\n            ship: t.shipName || ''\n          });\n        });\n      });\n\n      let rows = all;\n      if (Array.isArray(cfg.opFilter) && cfg.opFilter.length>0) {\n        rows = all.filter(r => r.opId && cfg.opFilter.includes(String(r.opId)));\n      }\n\n      rows.sort((a,b)=> a.dep - b.dep);\n\n      const todayStr = new Date().toDateString();\n      const nowMs = Date.now();\n      const arrivedToday = rows\n        .filter(r => (r.dep instanceof Date) && (r.arr instanceof Date) && r.dep.toDateString() === todayStr && r.arr.getTime() <= nowMs)\n        .sort((a,b) => b.arr - a.arr);\n      if (arrivedToday.length > 2) {\n        const keep = new Set(arrivedToday.slice(0,2).map(rowKey));\n        rows = rows.filter(r => {\n          const isArrivedToday = (r.dep instanceof Date) && (r.arr instanceof Date) && r.dep.toDateString() === todayStr && r.arr.getTime() <= nowMs;\n          return !isArrivedToday || keep.has(rowKey(r));\n        });\n      }\n\n      const total = rows.length;\n      if (total===0){\n        status.textContent = L.status_empty + (errs.length ? ' (some routes returned no data or errors)' : '');\n        clearStatusInline();\n        out.innerHTML='';\n        setLoader(false); btn.disabled=false; return;\n      }\n\n      const visibleRows = (limit10 && !revealAll && rows.length > 10) ? rows.slice(0,10) : rows;\n      const hiddenCount = rows.length - visibleRows.length;\n      soonKey = pickSoonKey(visibleRows);\n      featuredKey = pickFeaturedKey(visibleRows, soonKey);\n\n      status.textContent = errs.length ? ('Skipped '+errs.length+' route'+(errs.length>1?'s':'')) : '';\n      setStatusInline(\n  (L.status_found || '%d sailings found').replace('%d', '<strong>'+total+'<\/strong>')\n);\n      out.innerHTML = renderTable(visibleRows) + renderCards(visibleRows) + moreButtonHtml(hiddenCount);\n      bindRowLinks();\n      if (navHost) navHost.innerHTML = navHtml();\n\n    } catch(e){\n      status.textContent = 'Failed to load data';\n      out.innerHTML = '<pre>'+String(e.message||e)+'<\/pre>';\n    } finally {\n      setLoader(false);\n      btn.disabled = false;\n    }\n  }\n\n  wrap.addEventListener('click', function(e){\n    const nav = e.target.closest('.tp-day-nav a[data-shift]');\n    if (nav) {\n      e.preventDefault();\n      shiftDate(parseInt(nav.getAttribute('data-shift'),10) || 0);\n      return;\n    }\n    const more = e.target.closest('.tp-more-btn');\n    if (more) {\n      e.preventDefault();\n      revealAll = true;\n      load();\n    }\n  });\n\n  btn.addEventListener('click', load);\n  if (navHost) navHost.innerHTML = navHtml();\n  renderLocalTimes();\n  setInterval(renderLocalTimes, 30000);\n  if (cfg.autoload) load();\n})();\n<\/script>\n\n\t\t\t<\/section>\n\n\t\t\t<section id=\"dauer\">\n\t\t\t\t<h2>Wie lange dauert die \u00dcberfahrt D\u00fcnkirchen nach Dover?<\/h2>\n\t\t\t\t<p>Die \u00dcberfahrt dauert in beiden Richtungen zwei Stunden. Auf dem Ticket steht die Ankunft in der Ortszeit des Ankunftshafens: In England ist es eine Stunde fr\u00fcher als in Frankreich, deshalb erscheint nach Dover nur eine Stunde, nach D\u00fcnkirchen erscheinen drei. Stellen Sie die Uhr bei der Ankunft in Dover eine Stunde zur\u00fcck, auf der R\u00fcckfahrt eine Stunde vor.<\/p>\n\t\t\t\t<div class=\"dd-panel dd-tw\"><table class=\"dd-table\">\n\t\t\t\t\t<thead><tr><th>Richtung<\/th><th>Abfahrt (Ortszeit)<\/th><th>Ankunft (Ortszeit)<\/th><th>Tats\u00e4chliche Dauer<\/th><\/tr><\/thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t<tr><td>D\u00fcnkirchen nach Dover<\/td><td class=\"dd-num\">14:00 (MESZ)<\/td><td class=\"dd-num\">15:00 (BST)<\/td><td class=\"dd-num\">2 Stunden<\/td><\/tr>\n\t\t\t\t\t\t<tr><td>Dover nach D\u00fcnkirchen<\/td><td class=\"dd-num\">12:00 (BST)<\/td><td class=\"dd-num\">15:00 (MESZ)<\/td><td class=\"dd-num\">2 Stunden<\/td><\/tr>\n\t\t\t\t\t<\/tbody>\n\t\t\t\t<\/table><\/div>\n\t\t\t\t<p>Rechnen Sie von der Ankunft am Terminal bis zur Ausfahrt aus dem Hafen von Dover mit etwa dreieinhalb Stunden: eine Stunde am Terminal, zwei Stunden auf See und 15 bis 30 Minuten f\u00fcr das Abfahren von Bord.<\/p>\n\t\t\t\t<div class=\"dd-figs\"><figure class=\"dd-figure\"><img loading=\"lazy\" src=\"https:\/\/dover-dunkirk.com\/de\/wp-content\/uploads\/sites\/2\/2026\/09\/wake-leaving-dunkirk.webp\" alt=\"Kielwasser der F\u00e4hre bei der Ausfahrt aus dem Hafen von D\u00fcnkirchen\" width=\"1800\" height=\"1350\" loading=\"lazy\" decoding=\"async\"><figcaption>Abfahrt aus D\u00fcnkirchen: nach einer Viertelstunde liegt der Hafen hinter Ihnen.<\/figcaption><\/figure><figure class=\"dd-figure\"><img loading=\"lazy\" src=\"https:\/\/dover-dunkirk.com\/de\/wp-content\/uploads\/sites\/2\/2026\/09\/entering-dover-harbour.webp\" alt=\"Die F\u00e4hre passiert die Molenk\u00f6pfe von Dover\" width=\"1800\" height=\"1350\" loading=\"lazy\" decoding=\"async\"><figcaption>Zwei Stunden sp\u00e4ter: zwischen den Molenk\u00f6pfen von Dover hindurch.<\/figcaption><\/figure><\/div>\t\t\t<\/section>\n\n\t\t\t<section id=\"check-in\">\n\t\t\t\t<h2>Wann schlie\u00dft der Check-in?<\/h2>\n\t\t\t\t<p>Der Check-in schlie\u00dft 60 Minuten vor Abfahrt. Planen Sie am <a href=\"https:\/\/dover-dunkirk.com\/de\/hafen-duenkirchen\/\">Terminal Loon-Plage<\/a> 75 bis 90 Minuten vorher ein, in den Schulferien sowie freitags und samstags 90 bis 120 Minuten; in Dover, wo die <a href=\"https:\/\/dover-dunkirk.com\/de\/hafen-dover\/\">franz\u00f6sische Passkontrolle<\/a> vor dem Einschiffen stattfindet, in den Ferien 90 bis 120 Minuten. Das Einschiffen beginnt etwa 30 Minuten vor Abfahrt. Den Ablauf vom Schalter bis zur Rampe, mit Fotos, beschreibt <a href=\"https:\/\/dover-dunkirk.com\/de\/check-in\/\">Check-in Schritt f\u00fcr Schritt<\/a>.<\/p>\n\t\t\t\t\n\t\t\t\t<div class=\"dd-tip\"><svg class=\"dd-ic\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M12 11v5M12 8h.01\"\/><\/svg><span>Haustiere bleiben w\u00e4hrend der \u00dcberfahrt im Auto (<a href=\"https:\/\/dover-dunkirk.com\/de\/an-bord\/\">an Bord<\/a>). F\u00fchren Sie den Hund vor dem Check-in aus; neben dem Terminalgeb\u00e4ude gibt es einen Hundeauslauf.<\/span><\/div>\n\t\t\t\t<div class=\"dd-tip\"><svg class=\"dd-ic\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M12 11v5M12 8h.01\"\/><\/svg><span><strong>Unser Tipp.<\/strong> Mit Economy ist die Abfahrt fest gebucht; umbuchen kann eine Geb\u00fchr plus Preisdifferenz kosten. Mit Flexi wechseln Sie ohne Umbuchungsgeb\u00fchr, auch auf eine fr\u00fchere Abfahrt, wenn Sie schneller am Terminal sind als geplant. Bei Anreise aus S\u00fcddeutschland, Stau um Br\u00fcssel oder einer fr\u00fchen Abfahrt sichert Flexi Sie gegen eine verpasste Abfahrt ab. <a href=\"https:\/\/dover-dunkirk.com\/de\/go\/directferries-dunkirk-dover\/\" rel=\"sponsored nofollow noopener\" target=\"_blank\">Economy und Flexi f\u00fcr Ihr Datum vergleichen<\/a>.<\/span><\/div>\n\t\t\t<\/section>\n\n\t\t\t<section id=\"nacht\">\n\t\t\t\t<h2>Nachtf\u00e4hren und Wochenende<\/h2>\n\t\t\t\t<p>Die Abfahrt um 23:59 aus D\u00fcnkirchen und die um 04:00 gibt es nicht jeden Tag; am Wochenende entfallen einzelne Abfahrten. Die \u00dcbersicht oben zeigt je Tag, was f\u00e4hrt. Pr\u00fcfen Sie vor der Buchung in der \u00dcbersicht oben, ob die Nachtf\u00e4hre an Ihrem Reisetag f\u00e4hrt, und rechnen Sie nachts mit eingeschr\u00e4nkten Einrichtungen im Terminal.<\/p>\n\t\t\t\t<div class=\"dd-tip\"><svg class=\"dd-ic\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M12 11v5M12 8h.01\"\/><\/svg><span><strong>Unser Tipp.<\/strong> Die Abfahrten um 04:00 und 06:00 sind oft die g\u00fcnstigsten des Tages, verlangen aber, dass Sie zwischen 02:30 und 05:00 am Terminal stehen. Aus Deutschland hei\u00dft das eine Nachtfahrt. Wer am Vorabend in D\u00fcnkirchen oder Loon-Plage \u00fcbernachtet, ist morgens in 20 Minuten am Check-in und f\u00e4hrt ausgeruht in den Linksverkehr. <a href=\"https:\/\/dover-dunkirk.com\/de\/go\/stay22-dunkirk\/\" rel=\"sponsored nofollow noopener\" target=\"_blank\">Hotels in D\u00fcnkirchen f\u00fcr die Nacht vor der Abfahrt ansehen<\/a>.<\/span><\/div>\n\t\t\t<\/section>\n\n\t\t\t<section id=\"fragen\">\n\t\t\t\t<h2>H\u00e4ufige Fragen zu den Fahrzeiten<\/h2>\n\t\t\t\t<div class=\"dd-faq\">\n\t\t\t\t\t<details open><summary>Wie oft f\u00e4hrt die F\u00e4hre von D\u00fcnkirchen nach Dover? <svg class=\"dd-ic\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M6 9l6 6 6-6\"\/><\/svg><\/summary><p>Bis zu elfmal am Tag, an Werktagen meist zehnmal: um 04:00, 06:00, 08:00, 10:00, 12:00, 14:00, 16:00, 18:00, 20:00 und 23:59. Am Wochenende entfallen einzelne Abfahrten.<\/p><\/details>\n\t\t\t\t\t<details open><summary>Sind die Zeiten in deutscher Zeit? <svg class=\"dd-ic\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M6 9l6 6 6-6\"\/><\/svg><\/summary><p>Die Abfahrtszeiten aus D\u00fcnkirchen stehen in franz\u00f6sischer Zeit, die der deutschen entspricht. Die Abfahrtszeiten aus Dover stehen in englischer Zeit, eine Stunde fr\u00fcher.<\/p><\/details>\n\t\t\t\t\t<details open><summary>Wann f\u00e4hrt die erste und die letzte F\u00e4hre? <svg class=\"dd-ic\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M6 9l6 6 6-6\"\/><\/svg><\/summary><p>Die erste Abfahrt aus D\u00fcnkirchen ist um 04:00, die letzte um 23:59 an Tagen, an denen sie f\u00e4hrt. Aus Dover f\u00e4hrt die erste um 02:00 und die letzte um 22:00 englischer Zeit.<\/p><\/details>\n\t\t\t\t\t<details open><summary>Was passiert bei Versp\u00e4tung oder Ausfall? <svg class=\"dd-ic\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M6 9l6 6 6-6\"\/><\/svg><\/summary><p>Bei Sturm oder einem technischen Problem f\u00e4hrt DFDS mit weniger Schiffen; einzelne Abfahrten entfallen dann oder werden zusammengelegt. Ihre Buchung gilt f\u00fcr die n\u00e4chste Abfahrt mit freien Pl\u00e4tzen; bei einer Versp\u00e4tung von mehr als 90 Minuten k\u00f6nnen Sie stattdessen die Erstattung w\u00e4hlen (EU-Verordnung 1177\/2010). Aktuelle Meldungen stehen unter <a href=\"https:\/\/dover-dunkirk.com\/de\/aktuelle-abfahrten\/\">Aktuelle Abfahrten<\/a>, die Vorhersage f\u00fcr Wind und Wellen unter <a href=\"https:\/\/dover-dunkirk.com\/de\/wetter\/\">Wetter<\/a>.<\/p><\/details>\n\t\t\t\t<\/div>\n\t\t\t<\/section>\n\t\t<\/div>\n\n\t\t<aside class=\"dd-aside\">\n\t\t\t<div class=\"dd-panel\"><h3>F\u00fcr eine Abfahrt buchen<\/h3><p class=\"dd-small dd-muted\" style=\"margin:0 0 12px\">Die Preise unterscheiden sich je Abfahrt und Tag. Vergleichen Sie sie f\u00fcr Ihre Wunschzeit.<\/p><a class=\"dd-btn\" href=\"https:\/\/dover-dunkirk.com\/de\/go\/directferries-dunkirk-dover\/\" target=\"_blank\" rel=\"sponsored nofollow noopener\">Preise vergleichen<\/a><p class=\"dd-disc\">Sie buchen \u00fcber unseren Partner DirectFerries.<\/p><\/div>\n\t\t\t<div class=\"dd-panel\"><h3>Die Route in Zahlen<\/h3><div class=\"dd-panel dd-facts\"><dl><div><dt>\u00dcberfahrt<\/dt><dd class=\"dd-num\">2 Stunden<\/dd><\/div><div><dt>Abfahrten pro Tag<\/dt><dd class=\"dd-num\">bis zu 11 je Richtung<\/dd><\/div><div><dt>Check-in schlie\u00dft<\/dt><dd class=\"dd-num\">60 Min. vor Abfahrt<\/dd><\/div><div><dt>Pkw + 5, einfach<\/dt><dd class=\"dd-num\">ab 114 \u20ac<\/dd><\/div><div><dt>Fu\u00dfpassagiere<\/dt><dd class=\"dd-num\">nicht m\u00f6glich<\/dd><\/div><div><dt>Haustiere<\/dt><dd class=\"dd-num\">bleiben im Auto<\/dd><\/div><\/dl><\/div><\/div>\n\t\t\t<div class=\"dd-panel\"><h3>Auf dieser Seite<\/h3><nav class=\"dd-toc\"><a href=\"#heute\">Abfahrten heute<\/a><a href=\"#woche\">Kommende Woche nach Dover<\/a><a href=\"#woche-zurueck\">Kommende Woche nach D\u00fcnkirchen<\/a><a href=\"#datum\">Anderes Datum<\/a><a href=\"#dauer\">Dauer der \u00dcberfahrt<\/a><a href=\"#check-in\">Check-in<\/a><a href=\"#nacht\">Nacht und Wochenende<\/a><a href=\"#fragen\">Fragen<\/a><\/nav><\/div>\n\t\t<\/aside>\n\t<\/div>\n<\/div>\n\n","protected":false},"excerpt":{"rendered":"<p>Fahrzeiten D\u00fcnkirchen nach Dover DFDS f\u00e4hrt alle zwei Stunden, Tag und Nacht, in beide Richtungen. Unten stehen die Abfahrten von heute, der Fahrplan f\u00fcr die kommende Woche und die Zeiten, zu denen der Check-in schlie\u00dft. Abfahrtszeiten sind in der Ortszeit des Abfahrtshafens angegeben. Quelle: DFDS-Fahrplan \u00fcber DirectFerries, jede Minute aktualisiert Abfahrten heute Beide Richtungen, mit&#8230;<\/p>\n","protected":false},"author":2,"featured_media":268,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_kad_post_transparent":"","_kad_post_title":"hide","_kad_post_layout":"fullwidth","_kad_post_sidebar_id":"","_kad_post_content_style":"unboxed","_kad_post_vertical_padding":"","_kad_post_feature":"hide","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-88","page","type-page","status-publish","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Fahrzeiten D\u00fcnkirchen Dover: Abfahrten heute und Fahrplan<\/title>\n<meta name=\"description\" content=\"Fahrzeiten der DFDS-F\u00e4hre D\u00fcnkirchen nach Dover: alle Abfahrten von heute, der Fahrplan der kommenden Woche, 2 Stunden \u00dcberfahrt und Check-in-Schluss.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/dover-dunkirk.com\/de\/fahrzeiten\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Fahrzeiten D\u00fcnkirchen Dover: Abfahrten heute und Fahrplan\" \/>\n<meta property=\"og:description\" content=\"Fahrzeiten der DFDS-F\u00e4hre D\u00fcnkirchen nach Dover: alle Abfahrten von heute, der Fahrplan der kommenden Woche, 2 Stunden \u00dcberfahrt und Check-in-Schluss.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/dover-dunkirk.com\/de\/fahrzeiten\/\" \/>\n<meta property=\"og:site_name\" content=\"D\u00fcnkirchen Dover f\u00e4hre\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-28T19:49:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/dover-dunkirk.com\/de\/wp-content\/uploads\/sites\/2\/2026\/09\/delft-seaways-bow-loading-ramp.webp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data1\" content=\"2\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/dover-dunkirk.com\\\/de\\\/fahrzeiten\\\/\",\"url\":\"https:\\\/\\\/dover-dunkirk.com\\\/de\\\/fahrzeiten\\\/\",\"name\":\"Fahrzeiten D\u00fcnkirchen Dover: Abfahrten heute und Fahrplan\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/dover-dunkirk.com\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/dover-dunkirk.com\\\/de\\\/fahrzeiten\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/dover-dunkirk.com\\\/de\\\/fahrzeiten\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/dover-dunkirk.com\\\/de\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/09\\\/delft-seaways-bow-loading-ramp.webp\",\"datePublished\":\"2025-01-09T12:55:41+00:00\",\"dateModified\":\"2026-09-28T19:49:15+00:00\",\"description\":\"Fahrzeiten der DFDS-F\u00e4hre D\u00fcnkirchen nach Dover: alle Abfahrten von heute, der Fahrplan der kommenden Woche, 2 Stunden \u00dcberfahrt und Check-in-Schluss.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/dover-dunkirk.com\\\/de\\\/fahrzeiten\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/dover-dunkirk.com\\\/de\\\/fahrzeiten\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/dover-dunkirk.com\\\/de\\\/fahrzeiten\\\/#primaryimage\",\"url\":\"https:\\\/\\\/dover-dunkirk.com\\\/de\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/09\\\/delft-seaways-bow-loading-ramp.webp\",\"contentUrl\":\"https:\\\/\\\/dover-dunkirk.com\\\/de\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/09\\\/delft-seaways-bow-loading-ramp.webp\",\"width\":1400,\"height\":1050,\"caption\":\"Die Delft Seaways am Anleger in D\u00fcnkirchen mit heruntergelassener Rampe\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/dover-dunkirk.com\\\/de\\\/fahrzeiten\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"D\u00fcnkirchen nach Dover\",\"item\":\"https:\\\/\\\/dover-dunkirk.com\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Fahrzeiten D\u00fcnkirchen nach Dover\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/dover-dunkirk.com\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/dover-dunkirk.com\\\/de\\\/\",\"name\":\"D\u00fcnkirchen Dover f\u00e4hre\",\"description\":\"Von D\u00fcnkirchen nach Dover\",\"publisher\":{\"@id\":\"https:\\\/\\\/dover-dunkirk.com\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/dover-dunkirk.com\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/dover-dunkirk.com\\\/de\\\/#organization\",\"name\":\"D\u00fcnkirchen Dover f\u00e4hre\",\"url\":\"https:\\\/\\\/dover-dunkirk.com\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/dover-dunkirk.com\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/dover-dunkirk.com\\\/de\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2025\\\/01\\\/D.png\",\"contentUrl\":\"https:\\\/\\\/dover-dunkirk.com\\\/de\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2025\\\/01\\\/D.png\",\"width\":512,\"height\":512,\"caption\":\"D\u00fcnkirchen Dover f\u00e4hre\"},\"image\":{\"@id\":\"https:\\\/\\\/dover-dunkirk.com\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Fahrzeiten D\u00fcnkirchen Dover: Abfahrten heute und Fahrplan","description":"Fahrzeiten der DFDS-F\u00e4hre D\u00fcnkirchen nach Dover: alle Abfahrten von heute, der Fahrplan der kommenden Woche, 2 Stunden \u00dcberfahrt und Check-in-Schluss.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/dover-dunkirk.com\/de\/fahrzeiten\/","og_locale":"de_DE","og_type":"article","og_title":"Fahrzeiten D\u00fcnkirchen Dover: Abfahrten heute und Fahrplan","og_description":"Fahrzeiten der DFDS-F\u00e4hre D\u00fcnkirchen nach Dover: alle Abfahrten von heute, der Fahrplan der kommenden Woche, 2 Stunden \u00dcberfahrt und Check-in-Schluss.","og_url":"https:\/\/dover-dunkirk.com\/de\/fahrzeiten\/","og_site_name":"D\u00fcnkirchen Dover f\u00e4hre","article_modified_time":"2026-09-28T19:49:15+00:00","og_image":[{"url":"https:\/\/dover-dunkirk.com\/de\/wp-content\/uploads\/sites\/2\/2026\/09\/delft-seaways-bow-loading-ramp.webp","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Gesch\u00e4tzte Lesezeit":"2\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/dover-dunkirk.com\/de\/fahrzeiten\/","url":"https:\/\/dover-dunkirk.com\/de\/fahrzeiten\/","name":"Fahrzeiten D\u00fcnkirchen Dover: Abfahrten heute und Fahrplan","isPartOf":{"@id":"https:\/\/dover-dunkirk.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/dover-dunkirk.com\/de\/fahrzeiten\/#primaryimage"},"image":{"@id":"https:\/\/dover-dunkirk.com\/de\/fahrzeiten\/#primaryimage"},"thumbnailUrl":"https:\/\/dover-dunkirk.com\/de\/wp-content\/uploads\/sites\/2\/2026\/09\/delft-seaways-bow-loading-ramp.webp","datePublished":"2025-01-09T12:55:41+00:00","dateModified":"2026-09-28T19:49:15+00:00","description":"Fahrzeiten der DFDS-F\u00e4hre D\u00fcnkirchen nach Dover: alle Abfahrten von heute, der Fahrplan der kommenden Woche, 2 Stunden \u00dcberfahrt und Check-in-Schluss.","breadcrumb":{"@id":"https:\/\/dover-dunkirk.com\/de\/fahrzeiten\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/dover-dunkirk.com\/de\/fahrzeiten\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/dover-dunkirk.com\/de\/fahrzeiten\/#primaryimage","url":"https:\/\/dover-dunkirk.com\/de\/wp-content\/uploads\/sites\/2\/2026\/09\/delft-seaways-bow-loading-ramp.webp","contentUrl":"https:\/\/dover-dunkirk.com\/de\/wp-content\/uploads\/sites\/2\/2026\/09\/delft-seaways-bow-loading-ramp.webp","width":1400,"height":1050,"caption":"Die Delft Seaways am Anleger in D\u00fcnkirchen mit heruntergelassener Rampe"},{"@type":"BreadcrumbList","@id":"https:\/\/dover-dunkirk.com\/de\/fahrzeiten\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"D\u00fcnkirchen nach Dover","item":"https:\/\/dover-dunkirk.com\/de\/"},{"@type":"ListItem","position":2,"name":"Fahrzeiten D\u00fcnkirchen nach Dover"}]},{"@type":"WebSite","@id":"https:\/\/dover-dunkirk.com\/de\/#website","url":"https:\/\/dover-dunkirk.com\/de\/","name":"D\u00fcnkirchen Dover f\u00e4hre","description":"Von D\u00fcnkirchen nach Dover","publisher":{"@id":"https:\/\/dover-dunkirk.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/dover-dunkirk.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/dover-dunkirk.com\/de\/#organization","name":"D\u00fcnkirchen Dover f\u00e4hre","url":"https:\/\/dover-dunkirk.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/dover-dunkirk.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/dover-dunkirk.com\/de\/wp-content\/uploads\/sites\/2\/2025\/01\/D.png","contentUrl":"https:\/\/dover-dunkirk.com\/de\/wp-content\/uploads\/sites\/2\/2025\/01\/D.png","width":512,"height":512,"caption":"D\u00fcnkirchen Dover f\u00e4hre"},"image":{"@id":"https:\/\/dover-dunkirk.com\/de\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/dover-dunkirk.com\/de\/wp-json\/wp\/v2\/pages\/88","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dover-dunkirk.com\/de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/dover-dunkirk.com\/de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/dover-dunkirk.com\/de\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dover-dunkirk.com\/de\/wp-json\/wp\/v2\/comments?post=88"}],"version-history":[{"count":40,"href":"https:\/\/dover-dunkirk.com\/de\/wp-json\/wp\/v2\/pages\/88\/revisions"}],"predecessor-version":[{"id":316,"href":"https:\/\/dover-dunkirk.com\/de\/wp-json\/wp\/v2\/pages\/88\/revisions\/316"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dover-dunkirk.com\/de\/wp-json\/wp\/v2\/media\/268"}],"wp:attachment":[{"href":"https:\/\/dover-dunkirk.com\/de\/wp-json\/wp\/v2\/media?parent=88"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}