diff --git a/tests/src/Kernel/FieldTest.php b/tests/src/Kernel/FieldTest.php
index 09cd8b8..1d0b2de 100644
--- a/tests/src/Kernel/FieldTest.php
+++ b/tests/src/Kernel/FieldTest.php
@@ -191,30 +191,32 @@ class FieldTest extends KernelTestBase {
     $language->save();
 
     // Add a datetime field.
-    $field_datetime_storage = FieldStorageConfig::create(array(
-        'field_name' => 'field_datetime',
-        'type' => 'datetime',
-        'entity_type' => 'node',
-        'settings' => array('datetime_type' => DateTimeItem::DATETIME_TYPE_DATETIME),
-    ));
+    $field_datetime_storage = FieldStorageConfig::create([
+      'field_name' => 'field_datetime',
+      'type' => 'datetime',
+      'entity_type' => 'node',
+      'settings' => ['datetime_type' => DateTimeItem::DATETIME_TYPE_DATETIME],
+      'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
+    ]);
     $field_datetime_storage->save();
     $field_datetime = FieldConfig::create([
-        'field_storage' => $field_datetime_storage,
-        'bundle' => 'article',
+      'field_storage' => $field_datetime_storage,
+      'bundle' => 'article',
     ]);
     $field_datetime->save();
 
     // Add a daterange field.
-    $field_daterange_storage = FieldStorageConfig::create(array(
-        'field_name' => 'field_daterange',
-        'type' => 'daterange',
-        'entity_type' => 'node',
-        'settings' => array('datetime_type' => DateRangeItem::DATETIME_TYPE_DATETIME),
-    ));
+    $field_daterange_storage = FieldStorageConfig::create([
+      'field_name' => 'field_daterange',
+      'type' => 'daterange',
+      'entity_type' => 'node',
+      'settings' => ['datetime_type' => DateRangeItem::DATETIME_TYPE_DATETIME],
+      'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
+    ]);
     $field_daterange_storage->save();
     $field_daterange = FieldConfig::create([
-        'field_storage' => $field_daterange_storage,
-        'bundle' => 'article',
+      'field_storage' => $field_daterange_storage,
+      'bundle' => 'article',
     ]);
     $field_daterange->save();
   }
@@ -676,11 +678,17 @@ class FieldTest extends KernelTestBase {
       'type' => 'article',
     ]);
 
-    $node->set('field_datetime', '1925-09-28T00:00:00')->save();
+    $node->set('field_datetime', ['1925-09-28T00:00:00', '1930-10-28T00:00:00'])->save();
     $this->assertTokens('node', ['node' => $node], [
       'field_datetime:date:custom:Y' => '1925',
       'field_datetime:date:html_month' => '1925-09',
-      'field_datetime:date' => $node->field_datetime->date->getTimestamp(),
+      'field_datetime:date' => $node->get('field_datetime')->date->getTimestamp(),
+      'field_datetime:0:date:custom:Y' => '1925',
+      'field_datetime:0:date:html_month' => '1925-09',
+      'field_datetime:0:date' => $node->get('field_datetime')->date->getTimestamp(),
+      'field_datetime:1:date:custom:Y' => '1930',
+      'field_datetime:1:date:html_month' => '1930-10',
+      'field_datetime:1:date' => $node->get('field_datetime')->get(1)->date->getTimestamp(),
     ]);
   }
 
@@ -689,19 +697,34 @@ class FieldTest extends KernelTestBase {
    */
   public function testDatetimeRangeFieldTokens() {
 
+    /** @var \Drupal\node\NodeInterface $node */
     $node = Node::create([
         'title' => 'Node for daterange field',
         'type' => 'article',
     ]);
 
-    $node->field_daterange->value = '2013-12-22T00:00:00';
-    $node->field_daterange->end_value = '2016-08-26T00:00:00';
+    $node->get('field_daterange')->value = '2013-12-22T00:00:00';
+    $node->get('field_daterange')->end_value = '2016-08-26T00:00:00';
+    $node->get('field_daterange')->appendItem([
+      'value' => '2014-08-22T00:00:00',
+      'end_value' => '2017-12-20T00:00:00',
+    ]);
+    $node->get('field_daterange')->value = '2013-12-22T00:00:00';
+    $node->get('field_daterange')->end_value = '2016-08-26T00:00:00';
     $node->save();
     $this->assertTokens('node', ['node' => $node], [
       'field_daterange:start_date:html_month' => '2013-12',
       'field_daterange:start_date:custom:Y' => '2013',
       'field_daterange:end_date:custom:Y' => '2016',
-      'field_daterange:start_date' => $node->field_daterange->start_date->getTimestamp(),
+      'field_daterange:start_date' => $node->get('field_daterange')->start_date->getTimestamp(),
+      'field_daterange:0:start_date:html_month' => '2013-12',
+      'field_daterange:0:start_date:custom:Y' => '2013',
+      'field_daterange:0:end_date:custom:Y' => '2016',
+      'field_daterange:0:start_date' => $node->get('field_daterange')->start_date->getTimestamp(),
+      'field_daterange:1:start_date:html_month' => '2014-08',
+      'field_daterange:1:start_date:custom:Y' => '2014',
+      'field_daterange:1:end_date:custom:Y' => '2017',
+      'field_daterange:1:end_date' => $node->get('field_daterange')->get(1)->end_date->getTimestamp(),
     ]);
   }
 
diff --git a/token.tokens.inc b/token.tokens.inc
index 4eab4ec..2e3f466 100644
--- a/token.tokens.inc
+++ b/token.tokens.inc
@@ -1680,13 +1680,15 @@ function field_tokens($type, $tokens, array $data = array(), array $options = ar
         }
       }
       elseif (in_array($field_item->getFieldDefinition()->getType(), ['datetime', 'daterange']) && in_array($property_name, ['date', 'start_date', 'end_date'])) {
-        $datetime = $field_item->$property_name->getTimestamp();
-        if($property_name == $token) {
-          $replacements[$original] = $datetime;
+        $timestamp = $field_item->$property_name->getTimestamp();
+        // If the token is an exact match for the property or the delta and the
+        // property, use the timestamp as-is.
+        if($property_name == $token || "$delta:$property_name" == $token) {
+          $replacements[$original] = $timestamp;
         }
         else {
-          $field_tokens = \Drupal::token()->findWithPrefix($tokens, $property_name);
-          $replacements += \Drupal::token()->generate('date', $field_tokens, ['date' => $datetime], $options, $bubbleable_metadata);
+          $date_tokens = \Drupal::token()->findWithPrefix($filtered_tokens, $property_name);
+          $replacements += \Drupal::token()->generate('date', $date_tokens, ['date' => $timestamp], $options, $bubbleable_metadata);
         }
       }
       else {
