]> git.mjollnir.org Git - moodle.git/commitdiff
More changes to time calculations. Now they are done as indeed the prophet Martin
authordefacer <defacer>
Wed, 2 Jun 2004 11:21:14 +0000 (11:21 +0000)
committerdefacer <defacer>
Wed, 2 Jun 2004 11:21:14 +0000 (11:21 +0000)
foresaw that they could be, that is simple and elegant. The previous solution did the
job I guess, but it was based on a naive approach...

calendar/lib.php
calendar/view.php

index 65c4315ec0139fa34d4e41c0e3011503d4b20192..9a39aa5858cb4f718a766e09a6d4cae24552c05d 100644 (file)
@@ -130,7 +130,8 @@ function calendar_get_mini($courses, $groups, $users, $cal_month = false, $cal_y
 
     // We want to have easy access by day, since the display is on a per-day basis.
     // Arguments passed by reference.
-    calendar_events_by_day($events, $display->tstart, $eventsbyday, $durationbyday, $typesbyday);
+    //calendar_events_by_day($events, $display->tstart, $eventsbyday, $durationbyday, $typesbyday);
+    calendar_events_by_day($events, $m, $y, $eventsbyday, $durationbyday, $typesbyday);
 
     $content .= '<table class="calendarmini">'; // Begin table
     $content .= '<thead><tr>'; // Header row: day names
@@ -700,27 +701,28 @@ function calendar_day_representation($tstamp, $now = false, $usecommonwords = tr
     // To have it in one place, if a change is needed
     $formal = userdate($tstamp, $shortformat);
 
-    // Reverse TZ compensation: make GMT stamps correspond to user's TZ
-    $tzfix = calendar_get_tz_offset();
-    $tstamp += $tzfix;
-    $now += $tzfix;
-
-    $eventdays = intval($tstamp / SECS_IN_DAY);
-    $nowdays = intval($now / SECS_IN_DAY);
+    $datestamp = usergetdate($tstamp);
+    $datenow   = usergetdate($now);
 
     if($usecommonwords == false) {
         // We don't want words, just a date
         return $formal;
     }
-    else if($eventdays == $nowdays) {
+    else if($datestamp['year'] == $datenow['year'] && $datestamp['yday'] == $datenow['yday']) {
         // Today
         return get_string('today', 'calendar');
     }
-    else if($eventdays == $nowdays - 1) {
+    else if(
+        ($datestamp['year'] == $datenow['year'] && $datestamp['yday'] == $datenow['yday'] - 1 ) ||
+        ($datestamp['year'] == $datenow['year'] - 1 && $datestamp['mday'] == 31 && $datestamp['mon'] == 12 && $datenow['yday'] == 1)
+        ) {
         // Yesterday
         return get_string('yesterday', 'calendar');
     }
-    else if($eventdays == $nowdays + 1) {
+    else if(
+        ($datestamp['year'] == $datenow['year'] && $datestamp['yday'] == $datenow['yday'] + 1 ) ||
+        ($datestamp['year'] == $datenow['year'] + 1 && $datenow['mday'] == 31 && $datenow['mon'] == 12 && $datestamp['yday'] == 1)
+        ) {
         // Tomorrow
         return get_string('tomorrow', 'calendar');
     }
@@ -780,7 +782,7 @@ function calendar_wday_name($englishname) {
 }
 
 function calendar_days_in_month($month, $year) {
-   return date('t', mktime(0, 0, 0, $month, 1, $year));
+   return intval(date('t', mktime(0, 0, 0, $month, 1, $year)));
 }
 
 function calendar_get_sideblock_upcoming($courses, $groups, $users, $daysinfuture, $maxevents) {
@@ -826,7 +828,7 @@ function calendar_sub_month($month, $year) {
     }
 }
 
-function calendar_events_by_day($events, $starttime, &$eventsbyday, &$durationbyday, &$typesbyday) {
+function calendar_events_by_day($events, $month, $year, &$eventsbyday, &$durationbyday, &$typesbyday) {
     $eventsbyday = array();
     $typesbyday = array();
     $durationbyday = array();
@@ -835,61 +837,66 @@ function calendar_events_by_day($events, $starttime, &$eventsbyday, &$durationby
         return;
     }
 
-    // Reverse TZ compensation: make GMT stamps (from event table) correspond to user's TZ
-    $tzfix = calendar_get_tz_offset();
-
     foreach($events as $event) {
-        $eventdaystart = 1 + floor(($event->timestart + $tzfix - $starttime) / SECS_IN_DAY);
-        $eventdayend = 1 + floor(($event->timestart + $event->timeduration + $tzfix - $starttime) / SECS_IN_DAY);
 
-        // Give the event to its day
-        $eventsbyday[$eventdaystart][] = $event->id;
+        $startdate = usergetdate($event->timestart);
+        $enddate   = usergetdate($event->timestart + $event->timeduration);
 
-        // Mark the day as having such an event
-        if($event->courseid == 1 && $event->groupid == 0) {
-            $typesbyday[$eventdaystart]['startglobal'] = true;
-        }
-        else if($event->courseid > 1 && $event->groupid == 0) {
-            $typesbyday[$eventdaystart]['startcourse'] = true;
-        }
-        else if($event->groupid) {
-            $typesbyday[$eventdaystart]['startgroup'] = true;
-        }
-        else if($event->userid) {
-            $typesbyday[$eventdaystart]['startuser'] = true;
+        // Simple arithmetic: $year * 13 + $month is a distinct integer for each distinct ($year, $month) pair
+        if(!($startdate['year'] * 13 + $startdate['mon'] >= $year * 13 + $month) && ($enddate['year'] * 13 + $enddate['mon'] <= $year * 13 + $month)) {
+            // Out of bounds
+            continue;
         }
 
-        // Mark all days up to and including ending day as duration
-        if($eventdaystart < $eventdayend) {
+        $eventdaystart = intval($startdate['mday']);
 
-            // Normally this should be
+        if($startdate['mon'] == $month && $startdate['year'] == $year) {
+            // Give the event to its day
+            $eventsbyday[$eventdaystart][] = $event->id;
 
-            // $bound = min($eventdayend, $display->maxdays);
-            // for($i = $eventdaystart + 1; $i <= $bound; ++$i) {
+            // Mark the day as having such an event
+            if($event->courseid == 1 && $event->groupid == 0) {
+                $typesbyday[$eventdaystart]['startglobal'] = true;
+            }
+            else if($event->courseid > 1 && $event->groupid == 0) {
+                $typesbyday[$eventdaystart]['startcourse'] = true;
+            }
+            else if($event->groupid) {
+                $typesbyday[$eventdaystart]['startgroup'] = true;
+            }
+            else if($event->userid) {
+                $typesbyday[$eventdaystart]['startuser'] = true;
+            }
+        }
 
-            // So that we don't go on marking days after the end of
-            // the month if the event continues. However, this code
-            // has moved and now we don't have access to $display->maxdays.
-            // In order to save the overhead of recomputing it, we just
-            // use this "dumb" approach. Anyway, the function that called
-            // us already knows up to what day it should display.
+        if($event->timeduration == 0) {
+            // Proceed with the next
+            continue;
+        }
 
-            for($i = $eventdaystart + 1; $i <= $eventdayend; ++$i) {
-                $durationbyday[$i][] = $event->id;
-                if($event->courseid == 1 && $event->groupid == 0) {
-                    $typesbyday[$i]['durationglobal'] = true;
-                }
-                else if($event->courseid > 1 && $event->groupid == 0) {
-                    $typesbyday[$i]['durationcourse'] = true;
-                }
-                else if($event->groupid) {
-                    $typesbyday[$i]['durationgroup'] = true;
-                }
-                else if($event->userid) {
-                    $typesbyday[$i]['durationuser'] = true;
-                }
+        // The event starts on $month $year or before. So...
+        $lowerbound = $startdate['mon'] == $month && $startdate['year'] == $year ? intval($startdate['mday']) : 1;
+
+        // Also, it ends on $month $year or later...
+        $upperbound = $enddate['mon'] == $month && $enddate['year'] == $year ? intval($enddate['mday']) : calendar_days_in_month($month, $year);
+
+        // Mark all days between $lowerbound and $upperbound (inclusive) as duration
+        for($i = $lowerbound + 1; $i <= $upperbound; ++$i) {
+            $durationbyday[$i][] = $event->id;
+            if($event->courseid == 1 && $event->groupid == 0) {
+                $typesbyday[$i]['durationglobal'] = true;
+            }
+            else if($event->courseid > 1 && $event->groupid == 0) {
+                $typesbyday[$i]['durationcourse'] = true;
+            }
+            else if($event->groupid) {
+                $typesbyday[$i]['durationgroup'] = true;
+            }
+            else if($event->userid) {
+                $typesbyday[$i]['durationuser'] = true;
             }
         }
+
     }
     return;
 }
index e0d5af82348a2a93b343fa4edc41ed6641ccb726..8715d65dc449ab0ce35eb21b69d60aafdce23d8a 100644 (file)
@@ -316,7 +316,7 @@ function calendar_show_month_detailed($m, $y, $courses, $groups, $users) {
     }
 
     // Extract information: events vs. time
-    calendar_events_by_day($events, $display->tstart, $eventsbyday, $durationbyday, $typesbyday);
+    calendar_events_by_day($events, $m, $y, $eventsbyday, $durationbyday, $typesbyday);
 
     // New event button
     if(empty($USER) || isguest()) {