diff --git a/core/modules/datetime/datetime.module b/core/modules/datetime/datetime.module index bb10d13..22109be 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/DateTimeFormatterBase.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeFormatterBase.php index 71b9467..e623f13 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeFormatterBase.php +++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeFormatterBase.php @@ -202,10 +202,6 @@ protected function getFormatSettings() { * 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 = [ @@ -230,11 +226,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/src/Plugin/Field/FieldFormatter/DateTimeTimeAgoFormatter.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeTimeAgoFormatter.php index 3fc3157..782e1b8 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 f965e21..7514ae8 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeWidgetBase.php +++ b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeWidgetBase.php @@ -35,13 +35,8 @@ 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; @@ -59,9 +54,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; @@ -77,4 +69,28 @@ 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. + if ($this->getFieldSetting('datetime_type') === DateTimeItem::DATETIME_TYPE_DATE) { + $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 a234ae0..5c476a0 100644 --- a/core/modules/datetime/src/Tests/DateTestBase.php +++ b/core/modules/datetime/src/Tests/DateTestBase.php @@ -185,4 +185,21 @@ 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) { + if ($this->field->getSetting('datetime_type') === DateTimeItem::DATETIME_TYPE_DATE) { + // Mirror what \Drupal\datetime\DateTimeComputed::getValue() does to + // date-only items. + $date->setTime(12, 0, 0); + } + } + } diff --git a/core/modules/datetime/tests/src/Functional/DateTimeFieldTest.php b/core/modules/datetime/tests/src/Functional/DateTimeFieldTest.php index ab03ff5..fcdf1fc 100644 --- a/core/modules/datetime/tests/src/Functional/DateTimeFieldTest.php +++ b/core/modules/datetime/tests/src/Functional/DateTimeFieldTest.php @@ -99,7 +99,7 @@ public 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/Plugin/Field/FieldWidget/DateRangeWidgetBase.php b/core/modules/datetime_range/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php index e99374c..b9238e8 100644 --- a/core/modules/datetime_range/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php +++ b/core/modules/datetime_range/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php @@ -58,9 +58,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; @@ -88,9 +85,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; @@ -142,30 +136,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/tests/src/Functional/DateRangeFieldTest.php b/core/modules/datetime_range/tests/src/Functional/DateRangeFieldTest.php index 23ba8fa..ce6e22b 100644 --- a/core/modules/datetime_range/tests/src/Functional/DateRangeFieldTest.php +++ b/core/modules/datetime_range/tests/src/Functional/DateRangeFieldTest.php @@ -108,8 +108,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 = [ @@ -198,7 +198,7 @@ public function testDateRangeField() { $id = $match[1]; $this->assertText(t('entity_test @id has been created.', ['@id' => $id])); - datetime_date_default_time($start_date); + $this->massageTestDate($start_date); $this->displayOptions = [ 'type' => 'daterange_default',