Index: src/wp-includes/cron.php
===================================================================
--- src/wp-includes/cron.php	(revision 28372)
+++ src/wp-includes/cron.php	(working copy)
@@ -20,9 +20,9 @@
  * @param array $args Optional. Arguments to pass to the hook's callback function.
  */
 function wp_schedule_single_event( $timestamp, $hook, $args = array()) {
-	// don't schedule a duplicate if there's already an identical event due in the next 10 minutes
+	// don't schedule a duplicate if there's already an identical event due within 10 minutes of it
 	$next = wp_next_scheduled($hook, $args);
-	if ( $next && $next <= $timestamp + 10 * MINUTE_IN_SECONDS )
+	if ( $next && abs( $next - $timestamp) <= 10 * MINUTE_IN_SECONDS )
 		return;
 
 	$crons = _get_cron_array();
Index: tests/phpunit/tests/cron.php
===================================================================
--- tests/phpunit/tests/cron.php	(revision 28372)
+++ tests/phpunit/tests/cron.php	(working copy)
@@ -223,12 +223,31 @@
 		// second works too
 		wp_schedule_single_event( $ts2, $hook, $args );
 
-		// the next event should be at +5 minutes, not +3
+		// the next event should be at +3 minutes, even though that one was scheduled second
 		$this->assertEquals( $ts2, wp_next_scheduled($hook, $args) );
 		wp_unschedule_event( $ts2, $hook, $args );
-		// following event should be there too
+		// following event at +30 minutes should be there too
 		$this->assertEquals( $ts1, wp_next_scheduled($hook, $args) );
 	}
+
+	function test_not_duplicate_event_reversed() {
+		// duplicate events far apart should work normally regardless of order
+		$hook = rand_str();
+		$args = array(rand_str());
+		$ts1 = strtotime('+3 minutes');
+		$ts2 = strtotime('+30 minutes');
+
+		// first one works
+		wp_schedule_single_event( $ts1, $hook, $args );
+		// second works too
+		wp_schedule_single_event( $ts2, $hook, $args );
+
+		// the next event should be at +3 minutes
+		$this->assertEquals( $ts1, wp_next_scheduled($hook, $args) );
+		wp_unschedule_event( $ts1, $hook, $args );
+		// following event should be there too
+		$this->assertEquals( $ts2, wp_next_scheduled($hook, $args) );
+	}
 }
 
 /*
