< ?php /* Oxford University Date Converter Provides a class to manage conversion between term-time dates (expressed in weeks of term) and real-world dates that are usable outside the Oxford 'bubble'. Copyright (C) 2006 Rami R Chowdhury This script can be used under the terms of the GNU General Public License (http://www.gnu.org/copyleft/gpl.html) either version 2 or, at your opt- ion, any later version. I would in addition appreciate it if I were vis- ibly credited on any page that uses this code. */ function suffixate($num) { if ( ($num < 20) && ($num > 10) ) { return "${num}th"; // the *teens } $enum = $num % 10; switch ($enum) { case 1: return "${num}st"; case 2: return "${num}nd"; case 3: return "${num}rd"; default: return "${num}th"; } } class DateConverter { var $TermDates; var $TimeStamp; var $DaysOfWeek = Array ( "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ); var $MonthsOfYear = Array ( "", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"); /* A little documentation - variables called $timeArray are real-world date arrays, with "day", "month", and "year" elements. On the other hand the $oxfArray arrays contain "day", "week", "term", and "year" elements. */ function DateConverter() { $this->TermDates = array(); $this->TimeStamp = null; } function setTimeStamp($timeArray = null) { $tstamp = 0; if ($timeArray) { $tstamp = mktime(0, 1, 0, $timeArray['month'], $timeArray['day'], $timeArray['year'], 0); } else { $tstamp = time(); } $this->TimeStamp = $tstamp; } function setTermDates($timeArray = null) { if ($this->TimeStamp == null) { $this->setTimeStamp($timeArray); } $feastDayStamp = mktime(0, 1, 0, 1, 13, date("Y", $this->TimeStamp), 0); $nFeastDayStamp = mktime(0, 1, 0, 1, 13, date("Y", $this->TimeStamp) + 1, 0); $hilaryStart = strtotime("next Sunday", $feastDayStamp); $nHilaryStart = strtotime("next Sunday", $nFeastDayStamp); $michaelmasStart = strtotime("-14 weeks", $nHilaryStart); $trinityStart = strtotime("+14 weeks", $hilaryStart); $this->TermDates['HilaryStart'] = strtotime("-2 weeks", $hilaryStart); $this->TermDates['HilaryEnd'] = strtotime("+10 weeks", $hilaryStart); $this->TermDates['MichaelmasStart'] = strtotime("-2 weeks", $michaelmasStart); $this->TermDates['MichaelmasEnd'] = strtotime("+10 weeks", $michaelmasStart); $this->TermDates['TrinityStart'] = strtotime("-2 weeks", $trinityStart); $this->TermDates['TrinityEnd'] = strtotime("+10 weeks", $trinityStart); } function toOxford($timeArray = null) { $this->setTimeStamp($timeArray); $this->setTermDates(); $tstamp = $this->TimeStamp; $tDates = $this->TermDates; $oxfArray = array(); if ( ($tstamp >= $tDates['HilaryStart']) && ($tstamp <= $tDates['HilaryEnd']) ) { $oxfArray['term'] = "Hilary Term"; $oxfArray['week'] = (int) (( ($tstamp - $tDates['HilaryStart']) / 604800 ) ); // Accounting for 0th Week } elseif ( ($tstamp >= $tDates['TrinityStart']) && ($tstamp <= $tDates['TrinityEnd']) ) { $oxfArray['term'] = "Trinity Term"; $oxfArray['week'] = (int) (( ($tstamp - $tDates['TrinityStart']) / 604800 ) ); } elseif ( ($tstamp >= $tDates['MichaelmasStart']) && ($tstamp <= $tDates['MichaelmasEnd'])) { $oxfArray['term'] = "Michaelmas Term"; $oxfArray['week'] = (int) (( ($tstamp - $tDates['MichaelmasStart']) / 604800 ) ); } elseif ( ($tstamp >= $tDates['HilaryEnd']) && ($tstamp <= $tDates['TrinityStart']) ) { $oxfArray['term'] = "Easter Vacation"; $oxfArray['week'] = (int) ( (($tstamp - $tDates['HilaryEnd']) / 604800) + 2 ); } elseif ( ($tstamp >= $tDates['TrinityEnd']) && ($tstamp <= $tDates['MichaelmasStart']) ) { $oxfArray['term'] = "Long Vacation"; $oxfArray['week'] = (int) ( (($tstamp - $tDates['TrinityEnd']) / 604800) + 2 ); } elseif ( ($tstamp >= $tDates['MichaelmasEnd']) && ($tstamp <= $tDates['HilaryStart']) ) { $oxfArray['term'] = "Christmas Vacation"; $oxfArray['week'] = (int) ( (($tstamp - $tDates['MichaelmasEnd']) / 604800) + 2 ); } $oxfArray['day'] = date("w", $tstamp); $oxfArray['year'] = date("Y", $tstamp); return $oxfArray; } function toReal($oxfArray) { $this->setTimeStamp(Array( "day" => 1, "month" => 1, "year" => $oxfArray['year'])); $this->setTermDates(); $TermsLookup = Array ( "Hilary Term" => "HilaryStart", "Trinity Term" => "TrinityStart", "Michaelmas Term" => "MichaelmasStart", "Easter Vacation" => "HilaryEnd", "Long Vacation" => "TrinityEnd", "Christmas Vacation" => "MichaelmasEnd" ); $TermStart = $this->TermDates[$TermsLookup[$oxfArray['term']]]; //$TermStart = strtotime("+1 week", $TermStart); // As we start with -1st Week $week = ($oxfArray['week'] >= 0) ? "+$oxfArray[week]" : $oxfArray['week']; $RealTime = strtotime("$week weeks", $TermStart); $RealTime += ($oxfArray['day'] * 86400); $timeArray = array(); $timeArray['day'] = date("d", $RealTime); $timeArray['month'] = date("m", $RealTime); $timeArray['year'] = date("Y", $RealTime); return $timeArray; } } ? >