diff --git a/src/wp-admin/includes/class-wp-site-health.php b/src/wp-admin/includes/class-wp-site-health.php
index 12e127353b..dc70812bd8 100644
--- a/src/wp-admin/includes/class-wp-site-health.php
+++ b/src/wp-admin/includes/class-wp-site-health.php
@@ -16,9 +16,12 @@ class WP_Site_Health {
 	private $health_check_mysql_required_version = '5.5';
 	private $health_check_mysql_rec_version      = '';
 
-	public $schedules;
-	public $crons;
-	public $last_missed_cron = null;
+	public  $schedules;
+	public  $crons;
+	public  $last_missed_cron    = null;
+	public  $last_late_cron      = null;
+	private $timeout_missed_cron = null;
+	private $timeout_late_cron   = null;
 
 	/**
 	 * WP_Site_Health constructor.
@@ -28,6 +31,14 @@ class WP_Site_Health {
 	public function __construct() {
 		$this->prepare_sql_data();
 
+		$this->timeout_late_cron   = 0;
+		$this->timeout_missed_cron = - 5 * MINUTE_IN_SECONDS;
+
+		if ( defined( 'DISABLE_WP_CRON' ) && true === DISABLE_WP_CRON ) {
+			$this->timeout_late_cron   = - 15 * MINUTE_IN_SECONDS;
+			$this->timeout_missed_cron = - 1 * HOUR_IN_SECONDS;
+		}
+
 		add_filter( 'admin_body_class', array( $this, 'admin_body_class' ) );
 
 		add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
@@ -1424,6 +1435,19 @@ class WP_Site_Health {
 						$this->last_missed_cron
 					)
 				);
+			} else if ( $this->has_late_cron() ) {
+				$result['status'] = 'recommended';
+
+				$result['label'] = __( 'A scheduled event is late' );
+
+				$result['description'] = sprintf(
+					'<p>%s</p>',
+					sprintf(
+					/* translators: %s: The name of the failed cron event. */
+						__( 'The scheduled event, %s, is late to run. Your site still works, but this may indicate that scheduling posts or automated updates may not work as intended.' ),
+						$this->last_late_cron
+					)
+				);
 			}
 		}
 
@@ -1920,7 +1944,7 @@ class WP_Site_Health {
 		}
 
 		foreach ( $this->crons as $id => $cron ) {
-			if ( ( $cron->time - time() ) < 0 ) {
+			if ( ( $cron->time - time() ) < $this->timeout_missed_cron ) {
 				$this->last_missed_cron = $cron->hook;
 				return true;
 			}
@@ -1929,6 +1953,30 @@ class WP_Site_Health {
 		return false;
 	}
 
+	/**
+	 * Check if any scheduled tasks are late.
+	 *
+	 * Returns a boolean value of `true` if a scheduled task is late and ends processing. If the list of
+	 * crons is an instance of WP_Error, return the instance instead of a boolean value.
+	 *
+	 * @return bool|WP_Error true if a cron is late, false if it wasn't. WP_Error if the cron is set to that.
+	 */
+	public function has_late_cron() {
+		if ( is_wp_error( $this->crons ) ) {
+			return $this->crons;
+		}
+
+		foreach ( $this->crons as $id => $cron ) {
+			if ( ( $cron->time - time() ) >= $this->timeout_missed_cron
+			     && ( $cron->time - time() < $this->timeout_late_cron ) ) {
+				$this->last_late_cron = $cron->hook;
+				return true;
+			}
+		}
+
+		return false;
+	}
+
 	/**
 	 * Run a loopback test on our site.
 	 *
