getTimeZone(); } // Fall back on server time zone if none was supplied if(!isset($timeZone)) $timeZone = TimeZone::getDefaultTimeZone(); if(function_exists('date_default_timezone_set')) { // Use PHP5 functions if they exist $oldTimeZone = date_default_timezone_get(); date_default_timezone_set($timeZone); $date = date($format, $gmtStamp); date_default_timezone_set($timeZone); } else { // Fall back on PHP4 $oldTimeZone = getenv('TZ'); putenv('TZ=' . $timeZone); $date = strftime($format, $gmtStamp); putenv('TZ=' . $oldTimeZone); } return $date; } function isValidTimeZone($timeZone) { list($tzFlat, $tzTree) = TimeZone::_getTZData(); if(!isset($tzFlat[$timeZone])) { // A nonsensical (or unknown) server time zone was provided. return false; } return true; } function getTimeZones() { list($tzFlat, $tzTree) = TimeZone::_getTZData(); return $tzFlat; } function getDefaultTimeZone() { static $tzServer; // If configuration specifies the server timezone, use it. if(!isset($tzServer)) $tzServer = Config::getVar('i18n', 'default_timezone'); // Otherwise, intuit timezone as best we can if(!isset($tzServer)) if(function_exists('date_default_timezone_get')) $tzServer = date_default_timezone_get(); // Ensure the zone we picked up is valid and usable if(isset($tzServer) && !TimeZone::isValidTimeZone($tzServer)) { // A nonsensical (or unknown) server time zone was provided. // Invalidate it. $tzServer = null; } // Fall back on a known-good default if(!isset($tzServer)) $tzServer = "Etc/GMT"; return $tzServer; } function _getTZData() { static $tzFlat; static $tzTree; if (!isset($tzFlat)) { //$tzTree = array(); $tzFlat = array(); // Load registry file $xmlDao = &new XMLDAO(); $tzRaw = $xmlDao->parseStruct(TZ_REGISTRY_FILE, array("entry")); // Build tzTree and tzFlat by breaking tzRaw into path components. // TBD: this only happens once, and eases parsing of locale files, // but perhaps is best done when the XML is generated. foreach($tzRaw['entry'] as $value) { $key = $value['attributes']['key']; $name = $value['attributes']['name']; // tzFlat is simple. Just add an association. $tzFlat[$key] = $key; /*$exploded = explode('/', $key); // Ensure all path components exist as arrays $cursor = &$tzTree; for($i=0; $i