diff --git a/date.info b/date.info
index b2e9b48e..8296e5b8 100644
--- a/date.info
+++ b/date.info
@@ -1,6 +1,7 @@
 name = Date
 description = Makes date/time fields available.
 dependencies[] = date_api
+test_dependencies[] = entity
 package = Date/Time
 core = 7.x
 php = 5.2
@@ -14,3 +15,4 @@ files[] = tests/date_timezone.test
 files[] = tests/date_views_pager.test
 files[] = tests/date_views_popup.test
 files[] = tests/date_form.test
+files[] = tests/date_entity.test
diff --git a/date.module b/date.module
index e667b5dd..c397a83d 100644
--- a/date.module
+++ b/date.module
@@ -642,7 +642,7 @@ function date_entity_metadata_field_getter($entity, array $options, $name, $enti
   $return = entity_metadata_field_verbatim_get($entity, $options, $name, $entity_type, $context);
   $items = ($context['field']['cardinality'] == 1) ? array($return) : $return;
   foreach ($items as $key => $item) {
-    $items[$key] = date_entity_metadata_struct_getter($item, $options, 'value', 'struct', $context);
+    $items[$key] = date_entity_metadata_struct_getter($item, $options, 'value', 'field', $context);
   }
   return ($context['field']['cardinality'] == 1) ? $items[0] : $items;
 }
@@ -658,6 +658,16 @@ function date_entity_metadata_struct_getter($item, array $options, $name, $type,
 
   $timezone_db = !empty($item['timezone_db']) ? $item['timezone_db'] : 'UTC';
   $date = new DateObject($value, $timezone_db);
+
+  if ($type === 'field') {
+    $field_info = $info['field'];
+  }
+  else {
+    $field_info = field_info_field($info['field_name']);
+  }
+
+  $date->limitGranularity(date_granularity($field_info));
+
   return !empty($date) ? date_format_date($date, 'custom', 'U') : NULL;
 }
 
@@ -731,6 +741,8 @@ function date_entity_metadata_struct_setter(&$item, $name, $value, $langcode, $t
     if ($timezone_db != 'UTC') {
       date_timezone_set($date, timezone_open($timezone_db));
     }
+
+    $date->limitGranularity(date_granularity($field));
     $item[$name] = $date->format($format);
   }
 }
diff --git a/tests/date_entity.test b/tests/date_entity.test
new file mode 100644
index 00000000..6798ce3d
--- /dev/null
+++ b/tests/date_entity.test
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * @file
+ * Test date entity metadata wrapper integration.
+ */
+
+class DateEntityTestCase extends DateFieldBasic {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getInfo() {
+    return array(
+      'name' => 'Date entity metadata',
+      'description' => 'Tests integration between Date fields and entity metadata wrapper.',
+      'group' => 'Date',
+      'dependencies' => array('entity'),
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setUp() {
+    parent::setUp();
+    $modules = array('entity');
+    $success = module_enable($modules, TRUE);
+    $this->assertTrue($success, t('Enabled modules: %modules', array('%modules' => implode(', ', $modules))));
+  }
+
+  /**
+   * Test entity metadata wrapper integration.
+   */
+  public function testEntityMetadataWrapper() {
+    $field_config = array(
+      'label' => 'Test',
+      'field_name' => 'field_date_test',
+      'field_type' => 'datetime',
+      'granularity' => array('year', 'month', 'day'),
+      'entity_type' => 'node',
+      'bundle' => 'story',
+    );
+    $this->createDateField($field_config);
+
+    $node = entity_create($field_config['entity_type'], array('type' => $field_config['bundle']));
+    $wrapped_node = entity_metadata_wrapper($field_config['entity_type'], $node);
+
+    // November 6, 2017 09:35:37.
+    $timestamp = '1509914137';
+    $wrapped_node->{$field_config['field_name']}->value = $timestamp;
+    $expected = '1509840000';
+    $value = $wrapped_node->{$field_config['field_name']}->value->value();
+
+    $this->assertEqual($expected, $value, "The date return by metadata wrapper with limited granularity should be $expected, found $value.");
+
+    $this->deleteDateField($field_config['label']);
+  }
+
+}
