--- a/core/lib/Drupal/Core/Datetime/Element/Datelist.php
+++ b/core/lib/Drupal/Core/Datetime/Element/Datelist.php
@@ -305,9 +305,15 @@
         $form_state->setValueForElement($element, NULL);
       }
       // If there's empty input and the field is required, set an error.
-      elseif (empty($input['year']) && empty($input['month']) && empty($input['day']) && $element['#required']) {
-        $form_state->setError($element, t('The %field date is required.'));
+      elseif ($element['#required']) {
+        foreach (array('year', 'month', 'day') as $required_field) {
+          if (empty($input[$required_field])) {
+            $form_state->setError($element, t('The %field date is required.', array(
+              '%field' => $required_field)
+            ));
-      }
+          }
+        }
+      }
       else {
         // If the input is valid, set it.
         $date = $input['object'];
@@ -316,7 +322,9 @@
         }
         // If the input is invalid, set an error.
         else {
-          $form_state->setError($element, t('The %field date is invalid.'));
+          $form_state->setError($element, t('The %field date is invalid.', array(
+            '%field' => empty($element['#title']) ? $element['#id'] : $element['#title']
+          )));
         }
       }
     }
