diff --git src/wp-includes/post.php src/wp-includes/post.php
index 6360735..2f3aba9 100644
--- src/wp-includes/post.php
+++ src/wp-includes/post.php
@@ -3538,8 +3538,9 @@ function wp_update_post( $postarr = array(), $wp_error = false ) {
 		$post_cats = $post['post_category'];
 
 	// Drafts shouldn't be assigned a date unless explicitly done so by the user.
+	$missing_date_fields = empty( $postarr['post_date'] ) && empty( $postarr['post_date_gmt'] );
 	if ( isset( $post['post_status'] ) && in_array($post['post_status'], array('draft', 'pending', 'auto-draft')) && empty($postarr['edit_date']) &&
-			 ('0000-00-00 00:00:00' == $post['post_date_gmt']) )
+			 ('0000-00-00 00:00:00' == $post['post_date_gmt']) && $missing_date_fields )
 		$clear_date = true;
 	else
 		$clear_date = false;
diff --git tests/phpunit/tests/post.php tests/phpunit/tests/post.php
index 4f5a294..636b82b 100644
--- tests/phpunit/tests/post.php
+++ tests/phpunit/tests/post.php
@@ -1258,4 +1258,32 @@ class Tests_Post extends WP_UnitTestCase {
 		$this->assertEquals( 0, get_post( $page_id )->post_parent );
 	}
 
+	/**
+	 * @ticket 35874
+	 */
+	function test_wp_update_post_should_respect_post_date() {
+		$post = array(
+			'post_author' => self::$editor_id,
+			'post_status' => 'draft',
+			'post_content' => rand_str(),
+			'post_title' => rand_str(),
+		);
+
+		$id = wp_insert_post($post);
+
+		$out = get_post($id);
+
+		// Change the post status to publish while also supplying a date
+		$specific_date = strftime("%Y-%m-%d %H:%M:%S", strtotime('+1 day'));
+
+		$post['ID'] = $id;
+		$post['post_date'] = $specific_date;
+		$post['post_status'] = 'publish';
+		wp_update_post( $post );
+
+		// Updated post should still possess the specified date
+		$out = get_post($id);
+		$this->assertEquals($specific_date, $out->post_date);
+	}
+
 }
