1, 'feb' => 2, 'mar' => 3, 'apr' => 4, 'may' => 5, 'jun' => 6, 'jul' => 7, 'aug' => 8, 'sep' => 9, 'oct' => 10, 'nov' => 11, 'dec' => 12); $days = array('sun' => 0, 'mon' => 1, 'tue' => 2, 'wed' => 3, 'thu' => 4, 'fri' => 5, 'sat' => 6); // now reformat it a bit to match Moodle's DST table $moodle_rules = array(); foreach ($rules as $family => $rulesbyyear) { foreach ($rulesbyyear as $year => $rulesthisyear) { if(!isset($rulesthisyear['reset'])) { // No "reset" rule. We will assume that this is somewhere in the southern hemisphere // after a period of not using DST, otherwise it doesn't make sense at all. // With that assumption, we can put in a fake reset e.g. on Jan 1, 12:00. $rulesthisyear['reset'] = array( NULL, NULL, NULL, NULL, NULL, 'jan', 1, '12:00', '00:00', NULL ); } if(!isset($rulesthisyear['set'])) { // No "set" rule. We will assume that this is somewhere in the southern hemisphere // and that it begins a period of not using DST, otherwise it doesn't make sense at all. // With that assumption, we can put in a fake set on Dec 31, 12:00, shifting time by 0 minutes. $rulesthisyear['set'] = array( NULL, $rulesthisyear['reset'][1], NULL, NULL, NULL, 'dec', 31, '12:00', '00:00', NULL ); } list($discard, $name, $from, $to, $type, $in, $on, $at, $save, $letter) = $rulesthisyear['set']; $moodle_rule = array(); list($hours, $mins) = explode(':', $save); $save = $hours * 60 + $mins; list($hours, $mins) = explode(':', $at); $at = sprintf('%02d:%02d', $hours, $mins); $in = strtolower($in); if(!isset($months[$in])) { error('Unknown month: '.$in); } $moodle_rule['family'] = $name; $moodle_rule['year'] = $year; $moodle_rule['apply_offset'] = $save; // time offset $moodle_rule['activate_month'] = $months[$in]; // the month $moodle_rule['activate_time'] = $at; // the time // Encode index and day as per Moodle's specs if(is_numeric($on)) { $moodle_rule['activate_index'] = $on; $moodle_rule['activate_day'] = -1; } else { $on = strtolower($on); if(substr($on, 0, 4) == 'last') { // e.g. lastSun if(!isset($days[substr($on, 4)])) { error('Unknown last weekday: '.substr($on, 4)); } else { $moodle_rule['activate_index'] = -1; $moodle_rule['activate_day'] = $days[substr($on, 4)]; } } else if(substr($on, 3, 2) == '>=') { // e.g. Sun>=8 if(!isset($days[substr($on, 0, 3)])) { error('Unknown last weekday: '.substr($on, 0, 3)); } else { $moodle_rule['activate_index'] = substr($on, 5); $moodle_rule['activate_day'] = $days[substr($on, 0, 3)]; } } else { error('unknown on '.$on); } } // and now the "deactivate" data list($discard, $name, $from, $to, $type, $in, $on, $at, $save, $letter) = $rulesthisyear['reset']; list($hours, $mins) = explode(':', $at); $at = sprintf('%02d:%02d', $hours, $mins); $in = strtolower($in); if(!isset($months[$in])) { error('Unknown month: '.$in); } $moodle_rule['deactivate_month'] = $months[$in]; // the month $moodle_rule['deactivate_time'] = $at; // the time // Encode index and day as per Moodle's specs if(is_numeric($on)) { $moodle_rule['deactivate_index'] = $on; $moodle_rule['deactivate_day'] = -1; } else { $on = strtolower($on); if(substr($on, 0, 4) == 'last') { // e.g. lastSun if(!isset($days[substr($on, 4)])) { error('Unknown last weekday: '.substr($on, 4)); } else { $moodle_rule['deactivate_index'] = -1; $moodle_rule['deactivate_day'] = $days[substr($on, 4)]; } } else if(substr($on, 3, 2) == '>=') { // e.g. Sun>=8 if(!isset($days[substr($on, 0, 3)])) { error('Unknown last weekday: '.substr($on, 0, 3)); } else { $moodle_rule['deactivate_index'] = substr($on, 5); $moodle_rule['deactivate_day'] = $days[substr($on, 0, 3)]; } } else { error('unknown on '.$on); } } $moodle_rules[] = $moodle_rule; print_object($moodle_rule); } } return $moodle_rules; } ?>