diff --git a/plugins/FeedsParser.inc b/plugins/FeedsParser.inc
index c864f29..e4a0b38 100644
--- a/plugins/FeedsParser.inc
+++ b/plugins/FeedsParser.inc
@@ -503,14 +503,14 @@ class FeedsDateTimeElement extends FeedsElement {
     if ($use_start) {
       $use_start = $use_start->merge($temp);
       if (!date_timezone_is_valid($use_start->getTimezone()->getName())) {
-        $use_start->setTimezone(new DateTimeZone("UTC"));
+        $use_start->setTimezone(new DateTimeZone(variable_get('date_default_timezone')));
       }
       $db_tz = date_get_timezone_db($info['settings']['tz_handling'], $use_start->getTimezone()->getName());
     }
     if ($use_end) {
       $use_end = $use_end->merge($temp);
       if (!date_timezone_is_valid($use_end->getTimezone()->getName())) {
-        $use_end->setTimezone(new DateTimeZone("UTC"));
+        $use_end->setTimezone(new DateTimeZone(variable_get('date_default_timezone')));
       }
       if (!$db_tz) {
         $db_tz = date_get_timezone_db($info['settings']['tz_handling'], $use_end->getTimezone()->getName());
@@ -595,7 +595,7 @@ class FeedsDateTime extends DateTime {
     if (is_numeric($time)) {
       // Assume UNIX timestamp if it doesn't look like a simple year.
       if (strlen($time) > 4) {
-        $time = "@" . $time;
+        $time = '@' . $time;
       }
       // If it's a year, add a default month too, because PHP's date functions
       // won't parse standalone years after 2000 correctly (see explanation at
@@ -605,9 +605,14 @@ class FeedsDateTime extends DateTime {
       }
     }
 
+    // If the timezone is null, use default timezone.
+    if ($tz === NULL) {
+      $tz = variable_get('date_default_timezone');
+    }
+
     // PHP < 5.3 doesn't like the GMT- notation for parsing timezones.
-    $time = str_replace("GMT-", "-", $time);
-    $time = str_replace("GMT+", "+", $time);
+    $time = str_replace('GMT-', '-', $time);
+    $time = str_replace('GMT+', '+', $time);
 
     // Some PHP 5.2 version's DateTime class chokes on invalid dates.
     if (!date_create($time)) {
@@ -616,16 +621,9 @@ class FeedsDateTime extends DateTime {
 
     // Create and set time zone separately, PHP 5.2.6 does not respect time zone
     // argument in __construct().
-    parent::__construct($time);
-    $tz = $tz ? $tz : new DateTimeZone("UTC");
-    $this->setTimeZone($tz);
+    parent::__construct($time, $tz);
 
-    // Verify that timezone has not been specified as an offset.
-    if (!preg_match('/[a-zA-Z]/', $this->getTimezone()->getName())) {
-      $this->setTimezone(new DateTimeZone("UTC"));
-    }
-
-    // Finally set granularity.
+    // Finally, set granularity.
     $this->setGranularityFromTime($time, $tz);
   }
 
@@ -673,15 +671,23 @@ class FeedsDateTime extends DateTime {
     }
 
     if (!$this->hasTime() || !$this->hasGranularity('zone') || $force) {
-      // this has no time or timezone granularity, so timezone doesn't mean much
-      // We set the timezone using the method, which will change the day/hour, but then we switch back
+      // This has no time or timezone granularity, so timezone doesn't mean
+      // much. We set the timezone using the method, which will change the
+      // day/hour, but then we switch back.
       $arr = $this->toArray();
-      parent::setTimezone($tz);
+      $return = parent::setTimezone($tz);
       $this->setDate($arr['year'], $arr['month'], $arr['day']);
       $this->setTime($arr['hour'], $arr['minute'], $arr['second']);
-      return;
     }
-    parent::setTimezone($tz);
+    else {
+      $return = parent::setTimezone($tz);
+    }
+
+    // Make the return value standard between 5.2 and 5.3.
+    if ($return === FALSE) {
+      return FALSE;
+    }
+    return $this;
   }
 
   /**
@@ -727,7 +733,7 @@ class FeedsDateTime extends DateTime {
     $temp = date_parse($time);
     // This PHP method currently doesn't have resolution down to seconds, so if
     // there is some time, all will be set.
-    foreach (self::$allgranularity AS $g) {
+    foreach (self::$allgranularity as $g) {
       if ((isset($temp[$g]) && is_numeric($temp[$g])) || ($g == 'zone' && (isset($temp['zone_type']) && $temp['zone_type'] > 0))) {
         $this->granularity[] = $g;
       }
diff --git a/tests/feeds_date_time.test b/tests/feeds_date_time.test
index 989179d..5f1cd16 100644
--- a/tests/feeds_date_time.test
+++ b/tests/feeds_date_time.test
@@ -44,6 +44,12 @@ class FeedsDateTimeTest extends FeedsWebTestCase {
     $date2 = new FeedsDateTime('January 2012');
     $this->assertEqual($date1->format('U'), $date2->format('U'));
 
+    $datetime = new FeedsDateTime('2014-08-07T19:00:00+02:00');
+    $this->assertEqual('1407430800', $datetime->format('U'));
+
+    $datetime = new FeedsDateTime('Monday, 15-Aug-05 15:52:01 UTC');
+    $this->assertEqual('1124121121', $datetime->format('U'));
+
     // Check that years before 1902 work correctly.
     $early_date_string = '01/02/1901';
     $date = new FeedsDateTime($early_date_string);
