diff options
Diffstat (limited to 'program/include')
-rw-r--r-- | program/include/main.inc | 46 | ||||
-rw-r--r-- | program/include/rcube_config.php | 30 |
2 files changed, 42 insertions, 34 deletions
diff --git a/program/include/main.inc b/program/include/main.inc index ac804bd0a..ad41a13e7 100644 --- a/program/include/main.inc +++ b/program/include/main.inc @@ -1062,22 +1062,16 @@ function format_date($date, $format=NULL, $convert=true) if (empty($ts)) return ''; - if ($convert) { - // get user's timezone offset - $tz = $RCMAIL->config->get_timezone(); + $date = new DateTime; + $date->setTimestamp($ts); - // convert time to user's timezone - $timestamp = $ts - date('Z', $ts) + ($tz * 3600); + // convert to the right timezone + $stz = date_default_timezone_get(); + $tz = new DateTimeZone($convert ? $RCMAIL->config->get('timezone') : 'GMT'); + date_default_timezone_set($tz->getName()); + $date->setTimezone($tz); - // get current timestamp in user's timezone - $now = time(); // local time - $now -= (int)date('Z'); // make GMT time - $now += ($tz * 3600); // user's time - } - else { - $now = time(); - $timestamp = $ts; - } + $timestamp = $date->getTimestamp(); // define date format depending on current time if (!$format) { @@ -1098,6 +1092,7 @@ function format_date($date, $format=NULL, $convert=true) // strftime() format if (preg_match('/%[a-z]+/i', $format)) { $format = strftime($format, $timestamp); + date_default_timezone_set($stz); return $today ? (rcube_label('today') . ' ' . $format) : $format; } @@ -1113,20 +1108,20 @@ function format_date($date, $format=NULL, $convert=true) $out .= $format[$i]; // weekday (short) else if ($format[$i]=='D') - $out .= rcube_label(strtolower(date('D', $timestamp))); + $out .= rcube_label(strtolower($date->format('D'))); // weekday long else if ($format[$i]=='l') - $out .= rcube_label(strtolower(date('l', $timestamp))); + $out .= rcube_label(strtolower($date->format('l'))); // month name (short) else if ($format[$i]=='M') - $out .= rcube_label(strtolower(date('M', $timestamp))); + $out .= rcube_label(strtolower($date->format('M'))); // month name (long) else if ($format[$i]=='F') - $out .= rcube_label('long'.strtolower(date('M', $timestamp))); + $out .= rcube_label('long'.strtolower($date->format('M'))); else if ($format[$i]=='x') $out .= strftime('%x %X', $timestamp); else - $out .= date($format[$i], $timestamp); + $out .= $date->format($format[$i]); } if ($today) { @@ -1140,6 +1135,7 @@ function format_date($date, $format=NULL, $convert=true) } } + date_default_timezone_set($stz); return $out; } @@ -1878,17 +1874,13 @@ function rcmail_gen_message_id() // Returns RFC2822 formatted current date in user's timezone function rcmail_user_date() { - global $RCMAIL, $CONFIG; + global $RCMAIL; // get user's timezone - $tz = $RCMAIL->config->get_timezone(); - - $date = time() + $tz * 60 * 60; - $date = gmdate('r', $date); - $tz = sprintf('%+05d', intval($tz) * 100 + ($tz - intval($tz)) * 60); - $date = preg_replace('/[+-][0-9]{4}$/', $tz, $date); + $tz = new DateTimeZone($RCMAIL->config->get('timezone')); - return $date; + $date = new DateTime('now', $tz); + return $date->format('r'); } diff --git a/program/include/rcube_config.php b/program/include/rcube_config.php index f80f92c91..18a90a969 100644 --- a/program/include/rcube_config.php +++ b/program/include/rcube_config.php @@ -93,13 +93,15 @@ class rcube_config // set timezone auto settings values if ($this->prop['timezone'] == 'auto') { - $this->prop['dst_active'] = intval(date('I')); - $this->prop['_timezone_value'] = date('Z') / 3600 - $this->prop['dst_active']; + $this->prop['_timezone_value'] = $this->client_timezone(); } - else if ($this->prop['dst_active'] === null) { - $this->prop['dst_active'] = intval(date('I')); + else if (is_numeric($this->prop['timezone'])) { + $this->prop['timezone'] = timezone_name_from_abbr("", $this->prop['timezone'] * 3600, 0); } + // remove deprecated properties + unset($this->prop['dst_active']); + // export config data $GLOBALS['CONFIG'] = &$this->prop; } @@ -222,8 +224,7 @@ class rcube_config // override timezone settings with client values if ($this->prop['timezone'] == 'auto') { - $this->prop['_timezone_value'] = isset($_SESSION['timezone']) ? $_SESSION['timezone'] : $this->prop['_timezone_value']; - $this->prop['dst_active'] = $this->userprefs['dst_active'] = isset($_SESSION['dst_active']) ? $_SESSION['dst_active'] : $this->prop['dst_active']; + $this->prop['_timezone_value'] = isset($_SESSION['timezone']) ? $this->client_timezone() : $this->prop['_timezone_value']; } else if (isset($this->prop['_timezone_value'])) unset($this->prop['_timezone_value']); @@ -244,10 +245,16 @@ class rcube_config * Special getter for user's timezone offset including DST * * @return float Timezone offset (in hours) + * @deprecated */ public function get_timezone() { - return floatval($this->get('timezone')) + intval($this->get('dst_active')); + if ($this->get('timezone')) { + $tz = new DateTimeZone($this->get('timezone')); + return $tz->getOffset(new DateTime('now')) / 3600; + } + + return 0; } /** @@ -349,4 +356,13 @@ class rcube_config return empty($this->errors) ? false : join("\n", $this->errors); } + + /** + * Internal getter for client's (browser) timezone identifier + */ + private function client_timezone() + { + return isset($_SESSION['timezone']) ? timezone_name_from_abbr("", $_SESSION['timezone'] * 3600, 0) : date_default_timezone_get(); + } + } |