From 5879c09ca046c483d4102f1dd21babfac1cd8057 Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Wed, 04 Jan 2012 07:47:50 -0500
Subject: [PATCH] Use proper timezones from PHP's internal timezonedb (#1485592)

---
 program/include/main.inc |   46 +++++++++++++++++++---------------------------
 1 files changed, 19 insertions(+), 27 deletions(-)

diff --git a/program/include/main.inc b/program/include/main.inc
index ac804bd..ad41a13 100644
--- a/program/include/main.inc
+++ b/program/include/main.inc
@@ -1062,22 +1062,16 @@
   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 @@
   // 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 @@
       $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 @@
     }
   }
 
+  date_default_timezone_set($stz);
   return $out;
 }
 
@@ -1878,17 +1874,13 @@
 // 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();
+  $tz = new DateTimeZone($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);
-
-  return $date;
+  $date = new DateTime('now', $tz);
+  return $date->format('r');
 }
 
 

--
Gitblit v1.9.1