diff --git a/core/modules/datetime/config/schema/datetime.schema.yml b/core/modules/datetime/config/schema/datetime.schema.yml
index 406a2fd..46a52c7 100644
--- a/core/modules/datetime/config/schema/datetime.schema.yml
+++ b/core/modules/datetime/config/schema/datetime.schema.yml
@@ -7,6 +7,9 @@ field.storage_settings.datetime:
     datetime_type:
       type: string
       label: 'Date type'
+    timezone_handling:
+      type: string
+      label: 'Timezone handling'
 
 field.field_settings.datetime:
   type: mapping
diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeFormatterBase.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeFormatterBase.php
index 31d7dc5..0695982 100644
--- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeFormatterBase.php
+++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeFormatterBase.php
@@ -92,6 +92,9 @@ public static function defaultSettings() {
   public function settingsForm(array $form, FormStateInterface $form_state) {
     $form = parent::settingsForm($form, $form_state);
 
+    // @todo There should be a way to specify/change which timezone the date
+    // is displayed with (eg, for an event site that spans multiple timezones,
+    // transforming the time into the site/user's timezone may not make sense).
     $form['timezone_override'] = array(
       '#type' => 'select',
       '#title' => $this->t('Time zone override'),
diff --git a/core/modules/datetime/src/Plugin/Field/FieldType/DateTimeItem.php b/core/modules/datetime/src/Plugin/Field/FieldType/DateTimeItem.php
index 1617534..6ae7595 100644
--- a/core/modules/datetime/src/Plugin/Field/FieldType/DateTimeItem.php
+++ b/core/modules/datetime/src/Plugin/Field/FieldType/DateTimeItem.php
@@ -28,6 +28,7 @@ class DateTimeItem extends FieldItemBase {
   public static function defaultStorageSettings() {
     return array(
       'datetime_type' => 'datetime',
+      'timezone_handling' => 'site',
     ) + parent::defaultStorageSettings();
   }
 
@@ -56,6 +57,9 @@ public static function propertyDefinitions(FieldStorageDefinitionInterface $fiel
       ->setClass('\Drupal\datetime\DateTimeComputed')
       ->setSetting('date source', 'value');
 
+    $properties['timezone'] = DataDefinition::create('string')
+      ->setLabel(t('Timezone'));
+
     return $properties;
   }
 
@@ -63,18 +67,25 @@ public static function propertyDefinitions(FieldStorageDefinitionInterface $fiel
    * {@inheritdoc}
    */
   public static function schema(FieldStorageDefinitionInterface $field_definition) {
-    return array(
+    $schema = array(
       'columns' => array(
         'value' => array(
           'description' => 'The date value.',
           'type' => 'varchar',
           'length' => 20,
         ),
+        'timezone' => array(
+          'description' => 'The date timezone',
+          'type' => 'varchar',
+          'length' => 50,
+        ),
       ),
       'indexes' => array(
-        'value' => array('value'),
+        'value' => array('value', 'timezone'),
       ),
     );
+
+    return $schema;
   }
 
   /**
@@ -95,6 +106,29 @@ public function storageSettingsForm(array &$form, FormStateInterface $form_state
       '#disabled' => $has_data,
     );
 
+    $element['timezone_handling'] = array(
+      '#type' => 'select',
+      '#title' => t('Timezone handling'),
+      '#options' => array(
+        'site' => t("Site's timezone"),
+        'date' => t("Date's timezone"),
+        'user' => t("User's timezone"),
+        'utc' => 'UTC',
+        'none' => t('No timezone conversion'),
+      ),
+      '#default_value' => $this->getSetting('timezone_handling'),
+      '#required' => TRUE,
+      '#states' => array(
+        'visible' => array(
+          ':input[name="settings[datetime_type]"]' => ['value' => static::DATETIME_TYPE_DATETIME],
+        ),
+        'disabled' => array(
+          ':input[name="settings[datetime_type]"]' => ['value' => static::DATETIME_TYPE_DATE],
+        ),
+      ),
+      '#disabled' => $has_data,
+    );
+
     return $element;
   }
 
diff --git a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeWidgetBase.php b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeWidgetBase.php
index df23426..d382f04 100644
--- a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeWidgetBase.php
+++ b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeWidgetBase.php
@@ -30,11 +30,21 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
       '#type' => 'datetime',
       '#default_value' => NULL,
       '#date_increment' => 1,
-      '#date_timezone' => drupal_get_user_timezone(),
+      '#date_timezone' => $items[$delta]->timezone ?: drupal_get_user_timezone(),
       '#required' => $element['#required'],
     );
 
+    if ($this->getFieldSetting('timezone_handling') === 'date') {
+      $element['timezone'] = array(
+        '#type' => 'select',
+        '#options' => array_combine(\DateTimeZone::listIdentifiers(), \DateTimeZone::listIdentifiers()),
+        // Default to user's timezone.
+        '#default_value' => drupal_get_user_timezone(),
+      );
+    }
+
     if ($items[$delta]->date) {
+      /** @var \Drupal\Core\Datetime\DrupalDateTime $date */
       $date = $items[$delta]->date;
       // The date was created and verified during field_load(), so it is safe to
       // use without further inspection.
@@ -45,6 +55,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
       }
       $date->setTimezone(new \DateTimeZone($element['value']['#date_timezone']));
       $element['value']['#default_value'] = $date;
+      $element['timezone']['#default_value'] = $date->format('e');
     }
 
     return $element;
diff --git a/core/modules/datetime/tests/src/Kernel/DateTimeItemTest.php b/core/modules/datetime/tests/src/Kernel/DateTimeItemTest.php
index bba2c33..56a46ce 100644
--- a/core/modules/datetime/tests/src/Kernel/DateTimeItemTest.php
+++ b/core/modules/datetime/tests/src/Kernel/DateTimeItemTest.php
@@ -31,7 +31,10 @@ protected function setUp() {
       'field_name' => 'field_datetime',
       'type' => 'datetime',
       'entity_type' => 'entity_test',
-      'settings' => array('datetime_type' => 'date'),
+      'settings' => array(
+        'datetime_type' => 'date',
+        'timezone_handling' => 'site',
+      ),
     ));
     $field_storage->save();
     $field = FieldConfig::create([
@@ -120,4 +123,28 @@ public function testSetValueProperty() {
     $this->assertEqual($entity->field_datetime[0]->value, $value, '"Value" property can be set directly.');
   }
 
+  /**
+   * Tests DateTimeItem with per-date timezone handling.
+   */
+  public function testTimezoneDate() {
+    /** @var \Drupal\field\FieldStorageConfigInterface $field_storage */
+    $field_storage = FieldStorageConfig::load('entity_test.field_datetime');
+    $field_storage->setSetting('timezone_handling', 'date');
+    $field_storage->save();
+
+    // Use a non-UTC timezone.
+    $timezone = 'America/Yellowknife';
+
+    $entity = EntityTest::create();
+    $value = '2014-01-01T20:00:00Z';
+
+    $entity->set('field_datetime', ['value' => $value, 'timezone' => $timezone]);
+    $entity->save();
+
+    // Load the entity.
+    $id = $entity->id();
+    $entity = EntityTest::load($id);
+    $this->assertEqual($timezone, $entity->field_datetime[0]->timezone, '"timezone" property can be set.');
+  }
+
 }
