From: <jjo...@us...> - 2003-07-26 20:54:14
|
Update of /cvsroot/tikiwiki/tiki/lib In directory sc8-pr-cvs1:/tmp/cvs-serv8557/lib Modified Files: Tag: release_eta_carinea_rc1 searchlib.php tiki-js.js tikilib.php Added Files: Tag: release_eta_carinea_rc1 tikidate.php Log Message: Added TZ fixes (Tiki now uses lib/tikidate.php for all date conversions) --- NEW FILE: tikidate.php --- <?php /** * class: TikiDate * * This class takes care of all time/date conversions for * storing dates in the DB and displaying dates to the user. * * The objectives are: * - Dates will always stored in UTC in the database * - Display dates will be computed based on the preferred * display offset specified in the constructor * * TODO: As of 1.7, dates are still stored in server local time. * This should be changed for 1.7.1 (requires many module changes). * * Created by: Jeremy Jongsma (jjo...@ti...) * Created on: Sat Jul 26 11:51:31 CDT 2003 */ class TikiDate { /** * UTC offset to use for display */ var $display_offset; /** * Current UTC offset of server */ var $server_offset; /** * Default constructor * $_display_offset: desired offset for date display, in minutes */ function TikiDate($_display_offset = 0) { $this->display_offset = $_display_offset; $this->server_offset = intval(date("Z")); } /** * Convert a UTC timestamp to the preferred display offset. * $timestamp: UTC timestamp to convert. * returns: Display-offset timestamp. */ function getDisplayDateFromUTC ($_timestamp) { return $_timestamp + $this->display_offset; } /** * Convert a display-offset timestamp to UTC. * $timestamp: Display timestamp to convert. * returns: UTC timestamp. */ function getUTCFromDisplayDate ($_timestamp) { return $_timestamp - $this->display_offset; } /** * Convert a UTC timestamp to the local server time. * $timestamp: UTC timestamp to convert. * returns: Server timestamp. */ function getServerDateFromUTC ($_timestamp) { return $_timestamp + $this->server_offset; } /** * Convert a local server timestamp to UTC. * $timestamp: Server timestamp to convert. * returns: UTC timestamp. */ function getUTCFromServerDate ($_timestamp) { return $_timestamp - $this->server_offset; } /** * Convert a display timestamp to the local server time. * $timestamp: Display timestamp to convert. * returns: Server timestamp. */ function getServerDateFromDisplayDate ($_timestamp) { return $this->getServerDateFromUTC($this->getUTCFromDisplayDate($_timestamp)); } /** * Convert a local server timestamp to a display timestamp. * $timestamp: Server timestamp to convert. * returns: Display timestamp. */ function getDisplayDateFromServerDate ($_timestamp) { return $this->getDisplayDateFromUTC($this->getUTCFromServerDate($_timestamp)); } /** * Retrieve a current UTC timestamp. */ function getUTCTime () { return time() - $this->server_offset; } /** * Get the name of the current timezone. * * Currently, only "UTC" or an empty string (Local). */ function getTzName() { if ($this->display_offset == 0) return "UTC"; else return ""; } } Index: searchlib.php =================================================================== RCS file: /cvsroot/tikiwiki/tiki/lib/searchlib.php,v retrieving revision 1.6.2.1 retrieving revision 1.6.2.2 diff -u -d -r1.6.2.1 -r1.6.2.2 --- searchlib.php 21 Jul 2003 06:21:00 -0000 1.6.2.1 +++ searchlib.php 26 Jul 2003 20:54:11 -0000 1.6.2.2 @@ -244,7 +244,7 @@ function find_posts($words='',$offset=0,$maxRecords=-1, $fulltext = false) { $site_timezone_shortname = $this->get_site_timezone_shortname(); - $site_time_difference = $this->get_site_time_difference(/* $user */); + $site_time_difference = $this->get_site_time_difference($user); # TODO localize? $pagename = "CONCAT(b.title, ' [', ". "DATE_FORMAT(FROM_UNIXTIME(p.created + $site_time_difference), ". Index: tiki-js.js =================================================================== RCS file: /cvsroot/tikiwiki/tiki/lib/tiki-js.js,v retrieving revision 1.9.2.5 retrieving revision 1.9.2.6 diff -u -d -r1.9.2.5 -r1.9.2.6 --- tiki-js.js 23 Jul 2003 20:19:10 -0000 1.9.2.5 +++ tiki-js.js 26 Jul 2003 20:54:11 -0000 1.9.2.6 @@ -254,3 +254,12 @@ } // end if... else return true; } // switchCheckboxes() + +// +// Set client offset (in minutes) to a cookie to avoid server-side DST issues +// Added 7/25/03 by Jeremy Jongsma (jjo...@ti...) +// +var expires = new Date(); +var offset = -(expires.getTimezoneOffset() * 60); +expires.setFullYear(expires.getFullYear()+1); +setCookie("tz_offset", offset, expires, "/"); Index: tikilib.php =================================================================== RCS file: /cvsroot/tikiwiki/tiki/lib/tikilib.php,v retrieving revision 1.196.2.21 retrieving revision 1.196.2.22 diff -u -d -r1.196.2.21 -r1.196.2.22 --- tikilib.php 26 Jul 2003 19:09:44 -0000 1.196.2.21 +++ tikilib.php 26 Jul 2003 20:54:11 -0000 1.196.2.22 @@ -1,6 +1,7 @@ <?php include_once('lib/diff.php'); require_once('lib/Date.php'); +require_once('lib/tikidate.php'); // This class is included by all the Tiki php scripts, so it's important // to keep the class as small as possible to improve performance. @@ -3965,6 +3966,47 @@ return $display_timezone; } + /** + * Retrieves the user's preferred offset for displaying dates. + * + * $user: the logged-in user. + * returns: the preferred offset to UTC. + */ + function get_display_offset($_user = false) { + + // Cache preference from DB + $display_tz = "UTC"; + + // Default to UTCget_display_offset + $display_offset = 0; + + // Load pref from DB is cache is empty + if ($_user) $display_tz = $this->get_display_timezone($_user); + + // Recompute offset each request in case DST kicked in + if ($display_tz != "UTC" && isset($_COOKIE["tz_offset"])) + $display_offset = intval($_COOKIE["tz_offset"]); + + return $display_offset; + + } + + /** + * Retrieves a TikiDate object for converting to/from display/UTC timezones + * + * $user: the logged-in user + * returns: reference to a TikiDate instance with the appropriate offsets + */ + function &get_date_converter($_user = false) { + static $date_converter; + if (!$date_converter) + { + $display_offset = $this->get_display_offset($_user); + $date_converter =& new TikiDate($display_offset); + } + return $date_converter; + } + function get_long_date_format() { static $long_date_format = false; @@ -4091,9 +4133,9 @@ } function date_format($format, $timestamp, $user = false) { -#print "<pre>date_format()</pre>"; - $date = $this->get_site_date($timestamp, $user); - return $date->format($format); + //$date = $this->get_site_date($timestamp, $user); + // JJ - ignore conversion - we have no idea what TZ they're using + return $strftime($format,$timestamp); } function get_long_date($timestamp, $user = false) { @@ -4121,24 +4163,14 @@ } function get_site_timezone_shortname($user = false) { - static $timezone_shortname; - - if (!$timezone_shortname) { - $date = $this->get_site_date(date('U'), $user); - $timezone_shortname = $date->format('%Z'); - } - - return $timezone_shortname; + // UTC, or blank for local + $dc =& $this->get_date_converter($user); + return $dc->getTzName(); } function get_server_timezone_shortname($user = false) { - static $timezone_shortname; - - if (!$timezone_shortname) { - $timezone_shortname = date('%Z'); - } - - return $timezone_shortname; + // Site time is always UTC, from the user's perspective. + return "UTC"; } /** @@ -4146,28 +4178,10 @@ 'system' time to return a 'site' time. */ function get_site_time_difference($user = false) { - static $difference = false; - - if ($difference === false) { - $server_tzid = $this->get_server_timezone(); - $site_tzid = $this->get_display_timezone($user); -#print "<pre>"; -#printf("server_tzid='%s', site_tzid='%s'", $server_tzid, $site_tzid); - $server_tz =& new Date_TimeZone($server_tzid); - $site_tz =& new Date_TimeZone($site_tzid); -#printf("server_tz="); -#print_r($server_tz); -#printf("site_tz="); -#print_r($site_tz); - $now =& new Date(); - $server_offset = $server_tz->getOffset($now); - $site_offset = $site_tz->getOffset($now); -#printf("server_offset='%s', site_offset='%s'", $server_offset, $site_offset); - $difference = intval(($site_offset - $server_offset) / 1000); -#printf("difference=%s", $difference); - } - - return $difference; + $dc =& $this->get_date_converter($user); + $display_offset = $dc->display_offset; + $server_offset = $dc->server_offset; + return $display_offset - $server_offset; } |