diff --git a/core/core.api.php b/core/core.api.php
index 0be1870b17..cf53bb5fa3 100644
--- a/core/core.api.php
+++ b/core/core.api.php
@@ -2332,6 +2332,25 @@ function hook_validation_constraint_alter(array &$definitions) {
   $definitions['Null']['class'] = '\Drupal\mymodule\Validator\Constraints\MyClass';
 }
 
+/**
+ * Alter a formatted date.
+ *
+ * @param string $formatted_date
+ *   The string returned by format_date().
+ * @param array[] $context
+ *   Array containing the following:
+ *     - 'timestamp': UNIX timestamp passed to format_date()
+ *     - 'type': machie name of a Drupal\Core\Datetime\Entity\DateFormat entity
+ *     - 'format': the PHP date format
+ *     - 'timezone': timezone
+ *     - 'langcode': 2-letter langcode used for translation
+ */
+function hook_format_date_alter(&$formatted_date, array &$context) {
+  if ($context['type'] == 'medium') {
+    $formatted_date = t('This is in medium format: @string', ['@string' => $formatted_date]);
+  }
+}
+
 /**
  * @} End of "addtogroup hooks".
  */
diff --git a/core/lib/Drupal/Component/Datetime/DateTimePlus.php b/core/lib/Drupal/Component/Datetime/DateTimePlus.php
index 711eb4c9d1..d80991a129 100644
--- a/core/lib/Drupal/Component/Datetime/DateTimePlus.php
+++ b/core/lib/Drupal/Component/Datetime/DateTimePlus.php
@@ -696,6 +696,13 @@ public function format($format, $settings = []) {
         $dateTimeObject->setTimezone(new \DateTimeZone($settings['timezone']));
       }
       $value = $dateTimeObject->format($format);
+
+      // Provide hook_format_date_alter().
+      $context = $settings + [
+          'format' => $format,
+        ];
+
+      \Drupal::moduleHandler()->alter('format_date', $value, $context);
     }
     catch (\Exception $e) {
       $this->errors[] = $e->getMessage();
diff --git a/core/lib/Drupal/Core/Datetime/DateFormatter.php b/core/lib/Drupal/Core/Datetime/DateFormatter.php
index 7729080352..dc9aae9867 100644
--- a/core/lib/Drupal/Core/Datetime/DateFormatter.php
+++ b/core/lib/Drupal/Core/Datetime/DateFormatter.php
@@ -137,6 +137,9 @@ public function format($timestamp, $type = 'medium', $format = '', $timezone = N
 
     // Call $date->format().
     $settings = [
+      'timestamp' => $timestamp,
+      'type' => $type,
+      'timezone' => $timezone,
       'langcode' => $langcode,
     ];
     return $date->format($format, $settings);
