diff --git a/course/format/renderer.php b/course/format/renderer.php
index d969e8bc7c7..fb59c386a52 100644
--- a/course/format/renderer.php
+++ b/course/format/renderer.php
@@ -92,7 +92,7 @@ abstract class format_section_renderer_base extends plugin_renderer_base {
 
         if ($section->section != 0) {
             // Only in the non-general sections.
-            if ($course->marker == $section->section) {
+            if ($this->is_section_current($section, $course)) {
                 $o = get_accesshide(get_string('currentsection', 'format_'.$course->format));
             }
         }
@@ -121,7 +121,7 @@ abstract class format_section_renderer_base extends plugin_renderer_base {
             // Only in the non-general sections.
             if (!$section->visible) {
                 $sectionstyle = ' hidden';
-            } else if ($course->marker == $section->section) {
+            } else if ($this->is_section_current($section, $course)) {
                 $sectionstyle = ' current';
             }
             $linktitle = ($course->coursedisplay == COURSE_DISPLAY_MULTIPAGE);
@@ -669,4 +669,16 @@ abstract class format_section_renderer_base extends plugin_renderer_base {
         $options->overflowdiv = true;
         return format_text($summarytext, $section->summaryformat, $options);
     }
+
+    /**
+     * Is the section passed in the current section? (Note this isn't strictly
+     * a renderering method, but neater here).
+     *
+     * @param stdClass $course The course entry from DB
+     * @param stdClass $section The course_section entry from the DB
+     * @return bool true if the section is current
+     */
+    protected function is_section_current($section, $course) {
+        return ($course->marker == $section->section);
+    }
 }
diff --git a/course/format/weeks/lib.php b/course/format/weeks/lib.php
index 9201c9e2d6f..834addadec4 100644
--- a/course/format/weeks/lib.php
+++ b/course/format/weeks/lib.php
@@ -67,25 +67,20 @@ function callback_weeks_definition() {
 function callback_weeks_get_section_name($course, $section) {
     // We can't add a node without text
     if (!empty($section->name)) {
-        // Return the name the user set
-        return format_string($section->name, true, array('context' => get_context_instance(CONTEXT_COURSE, $course->id)));
+        // Return the name the user set.
+        return format_string($section->name, true, array('context' => context_course::instance($course->id)));
     } else if ($section->section == 0) {
-        // Return the section0name
+        // Return the general section.
         return get_string('section0name', 'format_weeks');
     } else {
-        // Got to work out the date of the week so that we can show it
-        $sections = get_all_sections($course->id);
-        $weekdate = $course->startdate+7200;
-        foreach ($sections as $sec) {
-            if ($sec->id == $section->id) {
-                break;
-            } else if ($sec->section != 0) {
-                $weekdate += 604800;
-            }
-        }
-        $strftimedateshort = ' '.get_string('strftimedateshort');
-        $weekday = userdate($weekdate, $strftimedateshort);
-        $endweekday = userdate($weekdate+518400, $strftimedateshort);
+        $dates = format_weeks_get_section_dates($section, $course);
+
+        // We subtract 24 hours for display purposes.
+        $dates->end = ($dates->end - 86400);
+
+        $dateformat = ' '.get_string('strftimedateshort');
+        $weekday = userdate($dates->start, $dateformat);
+        $endweekday = userdate($dates->end, $dateformat);
         return $weekday.' - '.$endweekday;
     }
 }
@@ -102,3 +97,23 @@ function callback_weeks_ajax_support() {
     $ajaxsupport->testedbrowsers = array('MSIE' => 6.0, 'Gecko' => 20061111, 'Safari' => 531, 'Chrome' => 6.0);
     return $ajaxsupport;
 }
+
+/**
+ * Return the start and end date of the passed section
+ *
+ * @param stdClass $section The course_section entry from the DB
+ * @param stdClass $course The course entry from DB
+ * @return stdClass property start for startdate, property end for enddate
+ */
+function format_weeks_get_section_dates($section, $course) {
+    $oneweekseconds = 604800;
+    // Hack alert. We add 2 hours to avoid possible DST problems. (e.g. we go into daylight
+    // savings and the date changes.
+    $startdate = $course->startdate + 7200;
+
+    $dates = new stdClass();
+    $dates->start = $startdate + ($oneweekseconds * ($section->section - 1));
+    $dates->end = $dates->start + $oneweekseconds;
+
+    return $dates;
+}
diff --git a/course/format/weeks/renderer.php b/course/format/weeks/renderer.php
index 33d640281b6..e87936ccbf5 100644
--- a/course/format/weeks/renderer.php
+++ b/course/format/weeks/renderer.php
@@ -26,6 +26,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 require_once($CFG->dirroot.'/course/format/renderer.php');
+require_once($CFG->dirroot.'/course/format/weeks/lib.php');
 
 
 /**
@@ -58,4 +59,22 @@ class format_weeks_renderer extends format_section_renderer_base {
     protected function page_title() {
         return get_string('weeklyoutline');
     }
+
+    /**
+     * Is the section passed in the current section?
+     *
+     * @param stdClass $section The course_section entry from the DB
+     * @param stdClass $course The course entry from DB
+     * @return bool true if the section is current
+     */
+    protected function is_section_current($section, $course) {
+        if ($section->section < 1) {
+            return false;
+        }
+
+        $timenow = time();
+        $dates = format_weeks_get_section_dates($section, $course);
+
+        return (($timenow >= $dates->start) && ($timenow < $dates->end));
+    }
 }