Index: trunk/roundcubemail/program/include/main.inc
===================================================================
--- trunk/roundcubemail/program/include/main.inc	(revision 5650)
+++ trunk/roundcubemail/program/include/main.inc	(revision 5707)
@@ -1063,20 +1063,14 @@
     return '';
 
-  if ($convert) {
-    // get user's timezone offset
-    $tz = $RCMAIL->config->get_timezone();
-
-    // convert time to user's timezone
-    $timestamp = $ts - date('Z', $ts) + ($tz * 3600);
-
-    // 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;
-  }
+  $date = new DateTime;
+  $date->setTimestamp($ts);
+
+  // 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);
+
+  $timestamp = $date->getTimestamp();
 
   // define date format depending on current time
@@ -1099,4 +1093,5 @@
   if (preg_match('/%[a-z]+/i', $format)) {
     $format = strftime($format, $timestamp);
+    date_default_timezone_set($stz);
     return $today ? (rcube_label('today') . ' ' . $format) : $format;
   }
@@ -1114,18 +1109,18 @@
     // 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]);
   }
 
@@ -1141,4 +1136,5 @@
   }
 
+  date_default_timezone_set($stz);
   return $out;
 }
@@ -1879,15 +1875,11 @@
 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);
-
-  return $date;
+  $tz = new DateTimeZone($RCMAIL->config->get('timezone'));
+
+  $date = new DateTime('now', $tz);
+  return $date->format('r');
 }
 
