diff --git a/date.field.inc b/date.field.inc
index b9e247a..53f6b30 100644
--- a/date.field.inc
+++ b/date.field.inc
@@ -302,13 +302,20 @@ function date_field_widget_info() {
  */
 function date_field_load($entity_type, $entities, $field, $instances, $langcode, &$items, $age) {
   foreach ($entities as $id => $entity) {
-    foreach ($items[$id] as $delta => $item) {
+    foreach ($items[$id] as $delta => &$item) {
       // If the file does not exist, mark the entire item as empty.
-      $timezone = isset($item['timezone']) ? $item['timezone'] : '';
       if (is_array($item)) {
-        $items[$id][$delta]['timezone'] = date_get_timezone($field['settings']['tz_handling'], $timezone);
-        $items[$id][$delta]['timezone_db'] = date_get_timezone_db($field['settings']['tz_handling']);
-        $items[$id][$delta]['date_type'] = $field['type'];
+        $timezone = isset($item['timezone']) ? $item['timezone'] : '';
+        $item['timezone'] = date_get_timezone($field['settings']['tz_handling'], $timezone);
+        $item['timezone_db'] = date_get_timezone_db($field['settings']['tz_handling']);
+        $item['date_type'] = $field['type'];
+        foreach (date_process_values($field) as $processed) {
+          if (!empty($item[$processed])) {
+            $date = new DateObject($item[$processed], $item['timezone_db'], date_type_format($field['type']));
+            $date->limitGranularity($field['settings']['granularity']);
+            $item['db'][$processed] = $date;
+          }
+        }
       }
     }
   }
diff --git a/date.module b/date.module
index f9afd28..2eeb5bb 100644
--- a/date.module
+++ b/date.module
@@ -189,7 +189,6 @@ function date_formatter_process($formatter, $entity_type, $entity, $field, $inst
   $format = date_formatter_format($formatter, $settings, $granularity, $langcode);
   $timezone = isset($item['timezone']) ? $item['timezone'] : '';
   $timezone = date_get_timezone($field['settings']['tz_handling'], $timezone);
-  $timezone_db = date_get_timezone_db($field['settings']['tz_handling']);
   $process = date_process_values($field);
   foreach ($process as $processed) {
     if (empty($item[$processed])) {
@@ -197,12 +196,9 @@ function date_formatter_process($formatter, $entity_type, $entity, $field, $inst
     }
     else {
       // create a date object with a gmt timezone from the database value
-      $value = $item[$processed];
-      $db_format = date_type_format($field['type']);
-      $date = new DateObject($value, $timezone_db, $db_format);
-      $date->limitGranularity($field['settings']['granularity']);
-
       $dates[$processed] = array();
+
+      $date = $item['db'][$processed];
       $dates[$processed]['db']['object'] = $date;
       $dates[$processed]['db']['datetime'] = date_format($date, DATE_FORMAT_DATETIME);
 
diff --git a/date_migrate/date_migrate.test b/date_migrate/date_migrate.test
index d65b212..5ce5a8c 100644
--- a/date_migrate/date_migrate.test
+++ b/date_migrate/date_migrate.test
@@ -18,6 +18,7 @@ class DateMigrateExampleUnitTest extends DrupalWebTestCase {
 
   function setUp() {
     parent::setUp('migrate', 'features', 'date', 'date_repeat', 'date_repeat_field',
+      'ctools',
       'date_migrate_example');
   }
 
diff --git a/date_migrate/date_migrate_example/date_migrate_example.info b/date_migrate/date_migrate_example/date_migrate_example.info
index 7cddcc1..53e1632 100644
--- a/date_migrate/date_migrate_example/date_migrate_example.info
+++ b/date_migrate/date_migrate_example/date_migrate_example.info
@@ -4,6 +4,7 @@ dependencies[] = "date_repeat"
 dependencies[] = "date_repeat_field"
 dependencies[] = "date_migrate"
 dependencies[] = "features"
+dependencies[] = "ctools"
 dependencies[] = "migrate"
 description = "Examples of migrating with the Date module"
 features[field][] = "node-date_migrate_example-body"
