diff --git a/core/modules/datetime/datetime.module b/core/modules/datetime/datetime.module
index 1078541..522725e 100644
--- a/core/modules/datetime/datetime.module
+++ b/core/modules/datetime/datetime.module
@@ -50,6 +50,9 @@ function datetime_help($route_name, RouteMatchInterface $route_match) {
  * same value for in both the local timezone and UTC.
  *
  * @param $date
+ *
+ * @deprecated in Drupal 8.4.0 and will be removed before Drupal 9.0.0. Use
+ *   (TBD) instead.
  */
 function datetime_date_default_time($date) {
   $date->setTime(12, 0, 0);
diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeCustomFormatter.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeCustomFormatter.php
index 678ddc8..a2ef7d5 100644
--- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeCustomFormatter.php
+++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeCustomFormatter.php
@@ -40,10 +40,6 @@ public function viewElements(FieldItemListInterface $items, $langcode) {
         /** @var \Drupal\Core\Datetime\DrupalDateTime $date */
         $date = $item->date;
 
-        if ($this->getFieldSetting('datetime_type') == 'date') {
-          // A date without time will pick up the current time, use the default.
-          datetime_date_default_time($date);
-        }
         $this->setTimeZone($date);
 
         $output = $this->formatDate($date);
diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeDefaultFormatter.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeDefaultFormatter.php
index 03c92ae..e0fe538 100644
--- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeDefaultFormatter.php
+++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeDefaultFormatter.php
@@ -42,11 +42,6 @@ public function viewElements(FieldItemListInterface $items, $langcode) {
         /** @var \Drupal\Core\Datetime\DrupalDateTime $date */
         $date = $item->date;
 
-        if ($this->getFieldSetting('datetime_type') == 'date') {
-          // A date without time will pick up the current time, use the default.
-          datetime_date_default_time($date);
-        }
-
         // Create the ISO date in Universal Time.
         $iso_date = $date->format("Y-m-d\TH:i:s") . 'Z';
 
diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimePlainFormatter.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimePlainFormatter.php
index 683d75c..a8ff469 100644
--- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimePlainFormatter.php
+++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimePlainFormatter.php
@@ -30,10 +30,6 @@ public function viewElements(FieldItemListInterface $items, $langcode) {
         /** @var \Drupal\Core\Datetime\DrupalDateTime $date */
         $date = $item->date;
 
-        if ($this->getFieldSetting('datetime_type') == 'date') {
-          // A date without time will pick up the current time, use the default.
-          datetime_date_default_time($date);
-        }
         $this->setTimeZone($date);
 
         $output = $this->formatDate($date);
diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeTimeAgoFormatter.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeTimeAgoFormatter.php
index 859ea5d..e79a94a 100644
--- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeTimeAgoFormatter.php
+++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeTimeAgoFormatter.php
@@ -110,10 +110,6 @@ public function viewElements(FieldItemListInterface $items, $langcode) {
       $date = $item->date;
       $output = [];
       if (!empty($item->date)) {
-        if ($this->getFieldSetting('datetime_type') == 'date') {
-          // A date without time will pick up the current time, use the default.
-          datetime_date_default_time($date);
-        }
         $output = $this->formatDate($date);
       }
       $elements[$delta] = $output;
diff --git a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeWidgetBase.php b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeWidgetBase.php
index aa6175a..1ea8241 100644
--- a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeWidgetBase.php
+++ b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeWidgetBase.php
@@ -44,13 +44,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
       $date = $items[$delta]->date;
       // The date was created and verified during field_load(), so it is safe to
       // use without further inspection.
-      if ($this->getFieldSetting('datetime_type') == DateTimeItem::DATETIME_TYPE_DATE) {
-        // A date without time will pick up the current time, use the default
-        // time.
-        datetime_date_default_time($date);
-      }
-      $date->setTimezone(new \DateTimeZone($element['value']['#date_timezone']));
-      $element['value']['#default_value'] = $date;
+      $element['value']['#default_value'] = $this->createDefaultValue($date, $element['value']['#date_timezone']);
     }
 
     return $element;
@@ -68,9 +62,6 @@ public function massageFormValues(array $values, array $form, FormStateInterface
         $date = $item['value'];
         switch ($this->getFieldSetting('datetime_type')) {
           case DateTimeItem::DATETIME_TYPE_DATE:
-            // If this is a date-only field, set it to the default time so the
-            // timezone conversion can be reversed.
-            datetime_date_default_time($date);
             $format = DATETIME_DATE_STORAGE_FORMAT;
             break;
 
@@ -86,4 +77,26 @@ public function massageFormValues(array $values, array $form, FormStateInterface
     return $values;
   }
 
+  /**
+   * Creates a date object for use as a default value.
+   *
+   * This will take a default value, apply the proper timezone for display in
+   * a widget, and set the default time for date-only fields.
+   *
+   * @param \Drupal\Core\Datetime\DrupalDateTime $date
+   *   The UTC default date.
+   * @param string $timezone
+   *   The timezone to apply.
+   *
+   * @return \Drupal\Core\Datetime\DrupalDateTime
+   *   A date object for use as a default value in a field widget.
+   */
+  protected function createDefaultValue($date, $timezone) {
+    // The date was created and verified during field_load(), so it is safe to
+    // use without further inspection.
+    $date->setTime(12, 0, 0);
+    $date->setTimezone(new \DateTimeZone($timezone));
+    return $date;
+  }
+
 }
diff --git a/core/modules/datetime/src/Tests/DateTestBase.php b/core/modules/datetime/src/Tests/DateTestBase.php
index 0f1277e..d24ca9f 100644
--- a/core/modules/datetime/src/Tests/DateTestBase.php
+++ b/core/modules/datetime/src/Tests/DateTestBase.php
@@ -3,6 +3,7 @@
 namespace Drupal\datetime\Tests;
 
 use Drupal\Component\Utility\Unicode;
+use Drupal\Core\Datetime\DrupalDateTime;
 use Drupal\Core\Entity\Entity\EntityFormDisplay;
 use Drupal\Core\Entity\Entity\EntityViewDisplay;
 use Drupal\datetime_range\Plugin\Field\FieldType\DateRangeItem;
@@ -179,4 +180,19 @@ protected function setSiteTimezone($timezone) {
       ->save();
   }
 
+  /**
+   * Massages test date values.
+   *
+   * If a date object is generated directly by a test, then it needs to be
+   * adjusted to behave like the computed date from the item.
+   *
+   * @param \Drupal\Core\Datetime\DrupalDateTime $date
+   *   A date object directly generated by the test.
+   */
+  protected function massageTestDate($date) {
+    // Mirror what \Drupal\datetime\DateTimeComputed::getValue() does to
+    // date-only items.
+    $date->setTime(12, 0, 0);
+  }
+
 }
diff --git a/core/modules/datetime/src/Tests/DateTimeFieldTest.php b/core/modules/datetime/src/Tests/DateTimeFieldTest.php
index f7aeae8..7da5566 100644
--- a/core/modules/datetime/src/Tests/DateTimeFieldTest.php
+++ b/core/modules/datetime/src/Tests/DateTimeFieldTest.php
@@ -96,7 +96,7 @@ function testDateField() {
       // Formats that display a time component for date-only fields will display
       // the default time, so that is applied before calculating the expected
       // value.
-      datetime_date_default_time($date);
+      $this->massageTestDate($date);
       foreach ($options as $setting => $values) {
         foreach ($values as $new_value) {
           // Update the entity display settings.
diff --git a/core/modules/datetime_range/src/DateTimeRangeTrait.php b/core/modules/datetime_range/src/DateTimeRangeTrait.php
index 5a34f2c..69df5cc 100644
--- a/core/modules/datetime_range/src/DateTimeRangeTrait.php
+++ b/core/modules/datetime_range/src/DateTimeRangeTrait.php
@@ -20,10 +20,6 @@
    *   A render array.
    */
   protected function buildDate(DrupalDateTime $date) {
-    if ($this->getFieldSetting('datetime_type') == DateTimeItem::DATETIME_TYPE_DATE) {
-      // A date without time will pick up the current time, use the default.
-      datetime_date_default_time($date);
-    }
     $this->setTimeZone($date);
 
     $build = [
@@ -48,11 +44,6 @@ protected function buildDate(DrupalDateTime $date) {
    *   A render array.
    */
   protected function buildDateWithIsoAttribute(DrupalDateTime $date) {
-    if ($this->getFieldSetting('datetime_type') == DateTimeItem::DATETIME_TYPE_DATE) {
-      // A date without time will pick up the current time, use the default.
-      datetime_date_default_time($date);
-    }
-
     // Create the ISO date in Universal Time.
     $iso_date = $date->format("Y-m-d\TH:i:s") . 'Z';
 
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 87cecbb..5c8e271 100644
--- a/core/modules/datetime_range/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php
+++ b/core/modules/datetime_range/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php
@@ -54,9 +54,6 @@ public function massageFormValues(array $values, array $form, FormStateInterface
         $start_date = $item['value'];
         switch ($this->getFieldSetting('datetime_type')) {
           case DateRangeItem::DATETIME_TYPE_DATE:
-            // If this is a date-only field, set it to the default time so the
-            // timezone conversion can be reversed.
-            datetime_date_default_time($start_date);
             $format = DATETIME_DATE_STORAGE_FORMAT;
             break;
 
@@ -84,9 +81,6 @@ public function massageFormValues(array $values, array $form, FormStateInterface
         $end_date = $item['end_value'];
         switch ($this->getFieldSetting('datetime_type')) {
           case DateRangeItem::DATETIME_TYPE_DATE:
-            // If this is a date-only field, set it to the default time so the
-            // timezone conversion can be reversed.
-            datetime_date_default_time($end_date);
             $format = DATETIME_DATE_STORAGE_FORMAT;
             break;
 
@@ -138,30 +132,4 @@ public function validateStartEnd(array &$element, FormStateInterface $form_state
     }
   }
 
-  /**
-   * Creates a date object for use as a default value.
-   *
-   * This will take a default value, apply the proper timezone for display in
-   * a widget, and set the default time for date-only fields.
-   *
-   * @param \Drupal\Core\Datetime\DrupalDateTime $date
-   *   The UTC default date.
-   * @param string $timezone
-   *   The timezone to apply.
-   *
-   * @return \Drupal\Core\Datetime\DrupalDateTime
-   *   A date object for use as a default value in a field widget.
-   */
-  protected function createDefaultValue($date, $timezone) {
-    // The date was created and verified during field_load(), so it is safe to
-    // use without further inspection.
-    if ($this->getFieldSetting('datetime_type') == DateTimeItem::DATETIME_TYPE_DATE) {
-      // A date without time will pick up the current time, use the default
-      // time.
-      datetime_date_default_time($date);
-    }
-    $date->setTimezone(new \DateTimeZone($timezone));
-    return $date;
-  }
-
 }
diff --git a/core/modules/datetime_range/src/Tests/DateRangeFieldTest.php b/core/modules/datetime_range/src/Tests/DateRangeFieldTest.php
index 759352e..e5839f1 100644
--- a/core/modules/datetime_range/src/Tests/DateRangeFieldTest.php
+++ b/core/modules/datetime_range/src/Tests/DateRangeFieldTest.php
@@ -105,8 +105,8 @@ public function testDateRangeField() {
       // Formats that display a time component for date-only fields will display
       // the default time, so that is applied before calculating the expected
       // value.
-      datetime_date_default_time($start_date);
-      datetime_date_default_time($end_date);
+      $this->massageTestDate($start_date);
+      $this->massageTestDate($end_date);
 
       // Reset display options since these get changed below.
       $this->displayOptions = [
@@ -183,7 +183,7 @@ public function testDateRangeField() {
       $id = $match[1];
       $this->assertText(t('entity_test @id has been created.', array('@id' => $id)));
 
-      datetime_date_default_time($start_date);
+      $this->massageTestDate($start_date);
 
       $this->displayOptions = [
         'type' => 'daterange_default',
