diff --git a/core/config/schema/core.entity.schema.yml b/core/config/schema/core.entity.schema.yml
index c88ca10bd3..0dc91b8bc8 100644
--- a/core/config/schema/core.entity.schema.yml
+++ b/core/config/schema/core.entity.schema.yml
@@ -204,6 +204,10 @@ field.widget.settings.email_default:
 field.widget.settings.datetime_timestamp:
   type: mapping
   label: 'Datetime timestamp display format settings'
+  mapping:
+    use_current_time:
+      type: boolean
+      label: 'Use current time on empty'
 
 field.widget.settings.boolean_checkbox:
   type: mapping
diff --git a/core/lib/Drupal/Core/Datetime/Plugin/Field/FieldWidget/TimestampDatetimeWidget.php b/core/lib/Drupal/Core/Datetime/Plugin/Field/FieldWidget/TimestampDatetimeWidget.php
index af3fd0dcee..ffb3bc52be 100644
--- a/core/lib/Drupal/Core/Datetime/Plugin/Field/FieldWidget/TimestampDatetimeWidget.php
+++ b/core/lib/Drupal/Core/Datetime/Plugin/Field/FieldWidget/TimestampDatetimeWidget.php
@@ -21,6 +21,42 @@
  */
 class TimestampDatetimeWidget extends WidgetBase {
 
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultSettings() {
+    return [
+        'use_current_time' => TRUE,
+      ] + parent::defaultSettings();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsForm(array $form, FormStateInterface $form_state) {
+    $element['use_current_time'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('Use current time on empty'),
+      '#description' => $this->t('Set the value to the current time upon submission when the form element is left empty.'),
+      '#default_value' => $this->getSetting('use_current_time'),
+    ];
+    return $element;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsSummary() {
+    $summary = [];
+
+    $summary[] = $this->t(
+      'Use current time on empty: @use_current_time',
+      ['@use_current_time' => $this->getSetting('use_current_time') ? 'Yes' : 'No']
+    );
+
+    return $summary;
+  }
+
   /**
    * {@inheritdoc}
    */
@@ -35,7 +71,12 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
 
     $element['value']['#description'] = $element['#description'] !== ''
     ? $element['#description']
-    : $this->t('Leave blank to use the time of form submission.');
+    : '';
+
+    if ($this->getSetting('use_current_time') && $element['#description'] === '') {
+      $element['value']['#description'] .= $this->t('Leave blank to use the time of form submission.');
+    }
+
     return $element;
   }
 
@@ -44,6 +85,11 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
    */
   public function massageFormValues(array $values, array $form, FormStateInterface $form_state) {
     foreach ($values as &$item) {
+      // Delta=0 will be shown even if value is empty.
+      // else don't save the form value.
+      if ($item['_original_delta'] > 0 && $item['value'] == NULL) {
+        unset($values[$item['_original_delta']]);
+      }
       // @todo The structure is different whether access is denied or not, to
       //   be fixed in https://www.drupal.org/node/2326533.
       if (isset($item['value']) && $item['value'] instanceof DrupalDateTime) {
@@ -52,10 +98,16 @@ public function massageFormValues(array $values, array $form, FormStateInterface
       elseif (isset($item['value']['object']) && $item['value']['object'] instanceof DrupalDateTime) {
         $date = $item['value']['object'];
       }
+      if (isset($date) && $date instanceof DrupalDateTime) {
+        $item['value'] = $date->getTimestamp();
+      }
+      if ($this->getSetting('use_current_time') == FALSE) {
+        $item['value'] = $item['value'] ?? NULL;
+      }
       else {
         $date = new DrupalDateTime();
+        $item['value'] = $date->getTimestamp();
       }
-      $item['value'] = $date->getTimestamp();
     }
     return $values;
   }
diff --git a/core/tests/Drupal/FunctionalTests/Datetime/TimestampTest.php b/core/tests/Drupal/FunctionalTests/Datetime/TimestampTest.php
index c84e0c875d..2a12144f92 100644
--- a/core/tests/Drupal/FunctionalTests/Datetime/TimestampTest.php
+++ b/core/tests/Drupal/FunctionalTests/Datetime/TimestampTest.php
@@ -38,10 +38,45 @@ class TimestampTest extends BrowserTestBase {
    */
   protected $field;
 
+  /**
+   * A field name to use in this test class..
+   *
+   * @var string
+   */
+  protected $fieldName;
+
+  /**
+   * A type to use in this test class.
+   *
+   * @var string
+   */
+  protected $type;
+
+  /**
+   * A widget type to use in this test class.
+   *
+   * @var string
+   */
+  protected $widgetType;
+
+  /**
+   * A formatter type to use in this test class.
+   *
+   * @var string
+   */
+  protected $formatterType;
+
+  /**
+   * A formDisplayOptions to use in this test class.
+   *
+   * @var array
+   */
+  protected $formDisplayOptions;
+
   /**
    * {@inheritdoc}
    */
-  protected static $modules = ['node', 'entity_test', 'field_ui'];
+  protected static $modules = ['node', 'entity_test', 'field_ui', 'datetime'];
 
   /**
    * {@inheritdoc}
@@ -64,15 +99,15 @@ protected function setUp(): void {
     ]);
 
     $this->drupalLogin($web_user);
-    $field_name = 'field_timestamp';
-    $type = 'timestamp';
-    $widget_type = 'datetime_timestamp';
-    $formatter_type = 'timestamp';
+    $this->fieldName = 'field_timestamp';
+    $this->type = 'timestamp';
+    $this->widgetType = 'datetime_timestamp';
+    $this->formatterType = 'timestamp';
 
     $this->fieldStorage = FieldStorageConfig::create([
-      'field_name' => $field_name,
+      'field_name' => $this->fieldName,
       'entity_type' => 'entity_test',
-      'type' => $type,
+      'type' => $this->type,
     ]);
     $this->fieldStorage->save();
     $this->field = FieldConfig::create([
@@ -83,12 +118,18 @@ protected function setUp(): void {
     ]);
     $this->field->save();
 
+    $this->formDisplayOptions = [
+      'type' => $this->widgetType,
+      'settings' => [
+        'use_current_time' => 0,
+      ],
+    ];
     EntityFormDisplay::load('entity_test.entity_test.default')
-      ->setComponent($field_name, ['type' => $widget_type])
+      ->setComponent($this->fieldName, $this->formDisplayOptions)
       ->save();
 
     $this->displayOptions = [
-      'type' => $formatter_type,
+      'type' => $this->formatterType,
       'label' => 'hidden',
     ];
 
@@ -97,7 +138,7 @@ protected function setUp(): void {
       'bundle' => $this->field->getTargetBundle(),
       'mode' => 'full',
       'status' => TRUE,
-    ])->setComponent($field_name, $this->displayOptions)
+    ])->setComponent($this->fieldName, $this->displayOptions)
       ->save();
   }
 
@@ -152,6 +193,53 @@ public function testWidget() {
     $medium = DateFormat::load('medium')->getPattern();
     $this->drupalGet('entity_test/' . $id);
     $this->assertSession()->pageTextContains($date->format($medium));
+
+    // Test 'use_current_time' settings.
+    $this->formDisplayOptions = [
+      'type' => $this->widgetType,
+      'settings' => [
+        'use_current_time' => 1,
+      ],
+    ];
+
+    EntityFormDisplay::load('entity_test.entity_test.default')
+      ->setComponent($this->fieldName, $this->formDisplayOptions)
+      ->save();
+
+    $date = new DrupalDateTime('now', 'UTC');
+
+    // Update the timezone to the system default.
+    $date->setTimezone(timezone_open(date_default_timezone_get()));
+
+    // Display creation form.
+    $this->drupalGet('entity_test/add');
+
+    // Make sure the "datetime_timestamp" widget is on the page.
+    $fields = $this->xpath('//div[contains(@class, "field--widget-datetime-timestamp") and @id="edit-field-timestamp-wrapper"]');
+    $this->assertCount(1, $fields);
+
+    // Look for the widget elements and make sure they are empty.
+    $this->assertSession()->fieldExists('field_timestamp[0][value][date]');
+    $this->assertSession()->fieldValueEquals('field_timestamp[0][value][date]', '');
+    $this->assertSession()->fieldExists('field_timestamp[0][value][time]');
+    $this->assertSession()->fieldValueEquals('field_timestamp[0][value][time]', '');
+
+    // Submit the date.
+    $date_format = DateFormat::load('html_date')->getPattern();
+    $time_format = DateFormat::load('html_time')->getPattern();
+
+    $edit = [
+      'field_timestamp[0][value][date]' => $date->format($date_format),
+      'field_timestamp[0][value][time]' => $date->format($time_format),
+    ];
+    $this->submitForm($edit, 'Save');
+
+    // Make sure the submitted date is set as the default in the widget.
+    $this->assertSession()->fieldExists('field_timestamp[0][value][date]');
+    $this->assertSession()->fieldValueEquals('field_timestamp[0][value][date]', $date->format($date_format));
+    $this->assertSession()->fieldExists('field_timestamp[0][value][time]');
+    $this->assertSession()->fieldValueEquals('field_timestamp[0][value][time]', $date->format($time_format));
+
   }
 
 }
