diff --git a/src/wp-includes/class-wp.php b/src/wp-includes/class-wp.php
index 23af2fff87..3e72de329b 100644
--- a/src/wp-includes/class-wp.php
+++ b/src/wp-includes/class-wp.php
@@ -413,6 +413,7 @@ class WP {
 		$headers       = array();
 		$status        = null;
 		$exit_required = false;
+		$date_format   = 'D, d M Y H:i:s';
 
 		if ( is_user_logged_in() ) {
 			$headers = array_merge( $headers, wp_get_nocache_headers() );
@@ -420,7 +421,7 @@ class WP {
 			// Unmoderated comments are only visible for 10 minutes via the moderation hash.
 			$expires = 10 * MINUTE_IN_SECONDS;
 
-			$headers['Expires']       = gmdate( 'D, d M Y H:i:s', time() + $expires );
+			$headers['Expires']       = gmdate( $date_format, time() + $expires );
 			$headers['Cache-Control'] = sprintf(
 				'max-age=%d, must-revalidate',
 				$expires
@@ -459,13 +460,20 @@ class WP {
 					)
 				)
 			) {
-				$wp_last_modified = mysql2date( 'D, d M Y H:i:s', get_lastcommentmodified( 'GMT' ), false );
+				$wp_last_modified_post    = mysql2date( $date_format, get_lastpostmodified( 'GMT' ), false );
+				$wp_last_modified_comment = mysql2date( $date_format, get_lastcommentmodified( 'GMT' ), false );
+
+				if ( strtotime( $wp_last_modified_post ) > strtotime( $wp_last_modified_comment ) ) {
+					$wp_last_modified = $wp_last_modified_post;
+				} else {
+					$wp_last_modified = $wp_last_modified_comment;
+				}
 			} else {
-				$wp_last_modified = mysql2date( 'D, d M Y H:i:s', get_lastpostmodified( 'GMT' ), false );
+				$wp_last_modified = mysql2date( $date_format, get_lastpostmodified( 'GMT' ), false );
 			}
 
 			if ( ! $wp_last_modified ) {
-				$wp_last_modified = gmdate( 'D, d M Y H:i:s' );
+				$wp_last_modified = gmdate( $date_format );
 			}
 
 			$wp_last_modified .= ' GMT';
diff --git a/tests/phpunit/tests/feed/rss2.php b/tests/phpunit/tests/feed/rss2.php
index 742c78f3d7..217b302732 100644
--- a/tests/phpunit/tests/feed/rss2.php
+++ b/tests/phpunit/tests/feed/rss2.php
@@ -494,4 +494,125 @@ class Tests_Feed_RSS2 extends WP_UnitTestCase {
 		);
 
 	}
+
+	/**
+	 * Test that the Last-Modified is a post's date when a more recent comment exists,
+	 * but the "withcomments=1" query var is not passed.
+	 *
+	 * @ticket 47968
+	 *
+	 * @covers ::send_headers
+	 */
+	public function test_feed_last_modified_should_be_a_post_date_when_withcomments_is_not_passed() {
+		$last_week = gmdate( 'Y-m-d H:i:s', strtotime( '-1 week' ) );
+		$yesterday = gmdate( 'Y-m-d H:i:s', strtotime( '-1 day' ) );
+
+		// Create a post dated last week.
+		$post_id = $this->factory()->post->create( array( 'post_date' => $last_week ) );
+
+		// Create a comment dated yesterday.
+		$this->factory()->comment->create(
+			array(
+				'comment_post_ID' => $post_id,
+				'comment_date'    => $yesterday,
+			)
+		);
+
+		// The Last-Modified header should have the post's date when "withcomments" is not passed.
+		add_filter(
+			'wp_headers',
+			function( $headers ) use ( $last_week ) {
+				$this->assertSame(
+					strtotime( $headers['Last-Modified'] ),
+					strtotime( $last_week ),
+					'Last-Modified was not the date of the post'
+				);
+				return $headers;
+			}
+		);
+
+		$this->go_to( '/?feed=rss2' );
+	}
+
+	/**
+	 * Test that the Last-Modified is a comment's date when a more recent comment exists,
+	 * and the "withcomments=1" query var is passed.
+	 *
+	 * @ticket 47968
+	 *
+	 * @covers ::send_headers
+	 */
+	public function test_feed_last_modified_should_be_the_date_of_a_comment_that_is_the_latest_update_when_withcomments_is_passed() {
+		$last_week = gmdate( 'Y-m-d H:i:s', strtotime( '-1 week' ) );
+		$yesterday = gmdate( 'Y-m-d H:i:s', strtotime( '-1 day' ) );
+
+		// Create a post dated last week.
+		$post_id = $this->factory()->post->create( array( 'post_date' => $last_week ) );
+
+		// Create a comment dated yesterday.
+		$this->factory()->comment->create(
+			array(
+				'comment_post_ID' => $post_id,
+				'comment_date'    => $yesterday,
+			)
+		);
+
+		// The Last-Modified header should have the comment's date when "withcomments=1" is passed.
+		add_filter(
+			'wp_headers',
+			function( $headers ) use ( $yesterday ) {
+				$this->assertSame(
+					strtotime( $headers['Last-Modified'] ),
+					strtotime( $yesterday ),
+					'Last-Modified was not the date of the comment'
+				);
+				return $headers;
+			}
+		);
+
+		$this->go_to( '/?feed=rss2&withcomments=1' );
+	}
+
+	/**
+	 * Test that the Last-Modified is the latest post's date when an earlier post and comment exist,
+	 * and the "withcomments=1" query var is passed.
+	 *
+	 * @ticket 47968
+	 *
+	 * @covers ::send_headers
+	 */
+	public function test_feed_last_modified_should_be_the_date_of_a_post_that_is_the_latest_update_when_withcomments_is_passed() {
+		$last_week = gmdate( 'Y-m-d H:i:s', strtotime( '-1 week' ) );
+		$yesterday = gmdate( 'Y-m-d H:i:s', strtotime( '-1 day' ) );
+		$today     = gmdate( 'Y-m-d H:i:s' );
+
+		// Create a post dated last week.
+		$post_id = $this->factory()->post->create( array( 'post_date' => $last_week ) );
+
+		// Create a comment dated yesterday.
+		$this->factory()->comment->create(
+			array(
+				'comment_post_ID' => $post_id,
+				'comment_date'    => $yesterday,
+			)
+		);
+
+		// Create a post dated today.
+		$this->factory()->post->create( array( 'post_date' => $today ) );
+
+		// The Last-Modified header should have the date from today's post when it is the latest update.
+		add_filter(
+			'wp_headers',
+			function( $headers ) use ( $today ) {
+				$this->assertSame(
+					strtotime( $headers['Last-Modified'] ),
+					strtotime( $today ),
+					'Last-Modified was not the date of the most recent most'
+				);
+				return $headers;
+			}
+		);
+
+		$this->go_to( '/?feed=rss2&withcomments=1' );
+	}
 }
