Index: wp-admin/includes/class-wp-site-health.php
===================================================================
--- wp-admin/includes/class-wp-site-health.php	(revision 45539)
+++ wp-admin/includes/class-wp-site-health.php	(working copy)
@@ -1411,7 +1411,8 @@
 				)
 			);
 		} else {
-			if ( $this->has_missed_cron() ) {
+			$has_missed_cron = $this->has_missed_cron();
+			if ( 'failed' === $has_missed_cron ) {
 				$result['status'] = 'recommended';
 
 				$result['label'] = __( 'A scheduled event has failed' );
@@ -1425,6 +1426,20 @@
 					)
 				);
 			}
+			else if ( 'late' === $has_missed_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_missed_cron
+					)
+				);
+			}
 		}
 
 		return $result;
@@ -1912,18 +1927,35 @@
 	 *
 	 * @since 5.2.0
 	 *
-	 * @return bool|WP_Error true if a cron was missed, false if it wasn't. WP_Error if the cron is set to that.
+	 * @return bool|string|WP_Error false if no cron was missed, 'failed' if a cron failed to run, 'late' if a cron is late to run. WP_Error if the cron is set to that.
 	 */
 	public function has_missed_cron() {
 		if ( is_wp_error( $this->crons ) ) {
 			return $this->crons;
 		}
 
+		$late_timeout = 0;
+		$failed_timeout = -5 * MINUTE_IN_SECONDS;
+		$late_cron = false;
+
+		if ( defined( 'DISABLE_WP_CRON' )  && true === DISABLE_WP_CRON ) {
+			$late_timeout = -15 * MINUTE_IN_SECONDS;
+			$failed_timeout = -HOUR_IN_SECONDS;
+		}
+
 		foreach ( $this->crons as $id => $cron ) {
-			if ( ( $cron->time - time() ) < 0 ) {
+			if ( ( $cron->time - time() ) < $failed_timeout ) {
 				$this->last_missed_cron = $cron->hook;
-				return true;
+				return 'failed';
 			}
+			else if ( ( $cron->time - time() < $late_timeout ) ) {
+				$this->last_missed_cron = $cron->hook;
+				$late_cron = true;
+			}
+		}
+
+		if ( true === $late_cron ) {
+			return 'late';
 		}
 
 		return false;
