diff --git a/core/modules/datetime_range/config/schema/datetime_range.schema.yml b/core/modules/datetime_range/config/schema/datetime_range.schema.yml
index f0f9325..934f349 100644
--- a/core/modules/datetime_range/config/schema/datetime_range.schema.yml
+++ b/core/modules/datetime_range/config/schema/datetime_range.schema.yml
@@ -55,7 +55,7 @@ field.formatter.settings.daterange_custom:
       translation context: 'Date range separator'
 
 field.widget.settings.daterange_datelist:
-  type: mapping
+  type: field.widget.settings.daterange_default
   label: 'Date range select list display format settings'
   mapping:
     increment:
@@ -71,3 +71,7 @@ field.widget.settings.daterange_datelist:
 field.widget.settings.daterange_default:
   type: mapping
   label: 'Date range default display format settings'
+  mapping:
+    year_range:
+      type: string
+      label: 'Year range'
diff --git a/core/modules/datetime_range/src/Element/YearRange.php b/core/modules/datetime_range/src/Element/YearRange.php
new file mode 100644
index 0000000..32dc354
--- /dev/null
+++ b/core/modules/datetime_range/src/Element/YearRange.php
@@ -0,0 +1,104 @@
+<?php
+
+namespace Drupal\datetime_range\Element;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Render\Element\FormElement;
+
+/**
+ * Provides a year range configuration element.
+ *
+ * @FormElement("date_year_range")
+ */
+class YearRange extends FormElement {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getInfo() {
+    $class = get_class($this);
+    return [
+      '#input' => TRUE,
+      '#element_validate' => [
+         [$class, 'validateRange'],
+      ],
+      '#process' => [
+         [$class, 'processRange'],
+      ],
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function valueCallback(&$element, $input, FormStateInterface $form_state) {
+    // Convert the element's default value from a string to an array (to match
+    // what we will get from the two textfields when the form is submitted).
+    if ($input === FALSE) {
+      list($years_back, $years_forward) = explode(':', $element['#default_value']);
+      return [
+        'years_back' => $years_back,
+        'years_forward' => $years_forward,
+      ];
+    }
+    return parent::valueCallback($element, $input, $form_state);
+  }
+
+  /**
+   * Process callback.
+   */
+  public static function processRange(&$element, FormStateInterface $form_state, &$complete_form) {
+    // Year range is stored in the -3:+3 format, but collected as two separate
+    // textfields.
+    $element['years_back'] = [
+      '#type' => 'textfield',
+      '#title' => t('Starting year'),
+      '#default_value' => $element['#value']['years_back'],
+      '#size' => 10,
+      '#maxsize' => 10,
+       '#description' => t('Enter a relative value (-9, +9) or an absolute year such as 2015.'),
+    ];
+    $element['years_forward'] = [
+      '#type' => 'textfield',
+      '#title' => t('Ending year'),
+      '#default_value' => $element['#value']['years_forward'],
+      '#size' => 10,
+      '#maxsize' => 10,
+      '#description' => t('Enter a relative value (-9, +9) or an absolute year such as 2015.'),
+    ];
+
+    $element['#tree'] = TRUE;
+
+    return $element;
+  }
+
+  /**
+   * Validate callback.
+   */
+  public static function validateRange(&$element, FormStateInterface $form_state, &$complete_form) {
+    // Recombine the two submitted form values into the -3:+3 format we will
+    // validate and save.
+    $year_range_submitted = $form_state->getValue($element['#parents']);
+    $year_range = $year_range_submitted['years_back'] . ':' . $year_range_submitted['years_forward'];
+    $form_state->setValue($element['#parents'], $year_range);
+    if (!self::rangeIsValid($year_range)) {
+      $form_state->setError($element['years_back'], t('Starting year must be in the format -9, or an absolute year such as 1980.'));
+      $form_state->setError($element['years_forward'], t('Ending year must be in the format +9, or an absolute year such as 2030.'));
+    }
+  }
+
+  /**
+   * Check if range is valid.
+   *
+   * @param string $range
+   *   Range to validate.
+   *
+   * @return bool
+   *   TRUE if range is valid.
+   */
+  public static function rangeIsValid($range) {
+    $matches = preg_match('@^(\-[0-9]+|[0-9]{4}):([\+|\-][0-9]+|[0-9]{4})$@', $range);
+    return !($matches < 1);
+  }
+
+}
diff --git a/core/modules/datetime_range/src/Plugin/Field/FieldWidget/DateRangeDatelistWidget.php b/core/modules/datetime_range/src/Plugin/Field/FieldWidget/DateRangeDatelistWidget.php
index 3e0e6e4..f31c173 100644
--- a/core/modules/datetime_range/src/Plugin/Field/FieldWidget/DateRangeDatelistWidget.php
+++ b/core/modules/datetime_range/src/Plugin/Field/FieldWidget/DateRangeDatelistWidget.php
@@ -143,7 +143,7 @@ public function settingsForm(array $form, FormStateInterface $form_state) {
    * {@inheritdoc}
    */
   public function settingsSummary() {
-    $summary = [];
+    $summary = parent::settingsSummary();
 
     $summary[] = $this->t('Date part order: @order', ['@order' => $this->getSetting('date_order')]);
     if ($this->getFieldSetting('datetime_type') == DateRangeItem::DATETIME_TYPE_DATETIME) {
diff --git a/core/modules/datetime_range/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php b/core/modules/datetime_range/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php
index e99374c..d372c6e 100644
--- a/core/modules/datetime_range/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php
+++ b/core/modules/datetime_range/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php
@@ -22,7 +22,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
 
     // Wrap all of the select elements with a fieldset.
     $element['#theme_wrappers'][] = 'fieldset';
-
+    $element['value']['#date_year_range'] = $this->getSetting('year_range');
     $element['#element_validate'][] = [$this, 'validateStartEnd'];
     $element['value']['#title'] = $this->t('Start date');
 
@@ -168,4 +168,34 @@ protected function createDefaultValue($date, $timezone) {
     return $date;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultSettings() {
+    return parent::defaultSettings() + [
+      'year_range' => '1900:2050',
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsForm(array $form, FormStateInterface $form_state) {
+    $build = parent::settingsForm($form, $form_state);
+    $build['year_range'] = [
+    '#type' => 'date_year_range',
+    '#default_value' => $this->getSetting('year_range'),
+    ];
+    return $build;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsSummary() {
+    return array_merge(parent::settingsSummary(), [$this->t('Year range: @range', [
+      '@range' => $this->getSetting('year_range'),
+    ])]);
+  }
+
 }
diff --git a/core/modules/datetime_range/tests/src/Functional/DateRangeYearRangeTest.php b/core/modules/datetime_range/tests/src/Functional/DateRangeYearRangeTest.php
new file mode 100644
index 0000000..cd67a9e
--- /dev/null
+++ b/core/modules/datetime_range/tests/src/Functional/DateRangeYearRangeTest.php
@@ -0,0 +1,123 @@
+<?php
+
+namespace Drupal\Tests\datetime_range\Functional;
+
+use Drupal\Core\Entity\Entity\EntityFormDisplay;
+use Drupal\datetime_range\Plugin\Field\FieldWidget\DateRangeDatelistWidget;
+use Drupal\field\Entity\FieldConfig;
+use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\Tests\BrowserTestBase;
+
+/**
+ * Tests the year range settings of the date range field.
+ *
+ * @group datetime_range
+ */
+class DateRangeYearRangeTest extends BrowserTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'entity_test',
+    'datetime_range',
+    'datetime',
+    'field'
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $storage = FieldStorageConfig::create([
+      'entity_type' => 'entity_test',
+      'field_name' => 'range',
+      'id' => 'entity_test.range',
+      'type' => 'daterange',
+      'settings' => [
+         'target_type' => 'entity_test',
+      ],
+    ]);
+    $storage->save();
+    $config = FieldConfig::create([
+      'field_name' => 'range',
+      'entity_type' => 'entity_test',
+      'bundle' => 'entity_test',
+      'id' => 'entity_test.entity_test.range',
+      'label' => 'Range',
+    ]);
+    $config->save();
+    $this->getEntityFormDisplay('entity_test', 'entity_test', 'default')
+         ->setComponent('range', [
+             'type' => 'daterange_datelist',
+             'weight' => 10,
+         ])
+         ->save();
+  }
+
+  /**
+   * Gets entity form display.
+   *
+   * @param string $entity_type
+   *   Entity type ID.
+   * @param string $bundle
+   *   Bundle.
+   * @param string $form_mode
+   *   Form mode.
+   *
+   * @return \Drupal\Core\Entity\EntityInterface
+   *   Form display.
+   */
+  protected function getEntityFormDisplay($entity_type, $bundle, $form_mode) {
+    $entity_form_display = EntityFormDisplay::load($entity_type . '.' . $bundle . '.' . $form_mode);
+
+    // If not found, create a fresh entity object. We do not preemptively create
+    // new entity form display configuration entries for each existing entity
+    // type and bundle whenever a new form mode becomes available. Instead,
+    // configuration entries are only created when an entity form display is
+    // explicitly configured and saved.
+    if (!$entity_form_display) {
+      $entity_form_display = EntityFormDisplay::create([
+        'targetEntityType' => $entity_type,
+        'bundle' => $bundle,
+        'mode' => $form_mode,
+        'status' => TRUE,
+      ]);
+    }
+
+    return $entity_form_display;
+  }
+
+  /**
+   * Test the year range widget setting.
+   */
+  public function testDateRangeYearRange() {
+    $this->drupalLogin($this->drupalCreateUser([], NULL, TRUE));
+    $this->drupalGet('/entity_test/add');
+    $assert = $this->assertSession();
+    $assert->fieldExists('range[0][value][year]');
+    // Test the default 1900:2050 range.
+    $assert->optionExists('range[0][value][year]', 1900);
+    $assert->optionExists('range[0][value][year]', 2050);
+    // Now change the settings.
+    $this->getEntityFormDisplay('entity_test', 'entity_test', 'default')
+         ->setComponent('range', [
+             'type' => 'daterange_datelist',
+             'weight' => 10,
+             'settings' => [
+                'year_range' => '1978:2017',
+             ] + DateRangeDatelistWidget::defaultSettings(),
+         ])
+         ->save();
+    $this->drupalGet('/entity_test/add');
+    $assert = $this->assertSession();
+    $assert->fieldExists('range[0][value][year]');
+    // Test the new 1978:2017 range.
+    $assert->optionNotExists('range[0][value][year]', 1900);
+    $assert->optionNotExists('range[0][value][year]', 2050);
+    $assert->optionExists('range[0][value][year]', 1978);
+    $assert->optionExists('range[0][value][year]', 2017);
+  }
+
+}
\ No newline at end of file
