Index: wp-includes/formatting.php
===================================================================
--- wp-includes/formatting.php	(revision 10733)
+++ wp-includes/formatting.php	(working copy)
@@ -1462,32 +1462,54 @@
  *
  * @param int $from Unix timestamp from which the difference begins.
  * @param int $to Optional. Unix timestamp to end the time difference. Default becomes time() if not set.
+ * @param int $limit Optional. The number of unit types to display (i.e. the accuracy). Defaults to 1.
  * @return string Human readable time difference.
  */
-function human_time_diff( $from, $to = '' ) {
+function human_time_diff( $from, $to = '', $limit = 1 ) {
+	// Since all months/years aren't the same, these values are what Google's calculator says
+	$units = apply_filters( 'time_units', array(
+		31556926 => array( __('%s year'),  __('%s years') ),
+		2629744  => array( __('%s month'), __('%s months') ),
+		604800   => array( __('%s week'),  __('%s weeks') ),
+		86400    => array( __('%s day'),   __('%s days') ),
+		3600     => array( __('%s hour'),  __('%s hours') ),
+		60       => array( __('%s min'),   __('%s mins') ),
+	) );
+
 	if ( empty($to) )
 		$to = time();
-	$diff = (int) abs($to - $from);
-	if ($diff <= 3600) {
-		$mins = round($diff / 60);
-		if ($mins <= 1) {
-			$mins = 1;
-		}
-		$since = sprintf(_n('%s min', '%s mins', $mins), $mins);
-	} else if (($diff <= 86400) && ($diff > 3600)) {
-		$hours = round($diff / 3600);
-		if ($hours <= 1) {
-			$hours = 1;
-		}
-		$since = sprintf(_n('%s hour', '%s hours', $hours), $hours);
-	} elseif ($diff >= 86400) {
-		$days = round($diff / 86400);
-		if ($days <= 1) {
-			$days = 1;
-		}
-		$since = sprintf(_n('%s day', '%s days', $days), $days);
+
+	$from = (int) $from;
+	$to   = (int) $to;
+	$diff = (int) abs( $to - $from );
+
+	$items = 0;
+	$output = array();
+
+	foreach ( $units as $unitsec => $unitnames ) {
+		if ( $items >= $limit )
+			break;
+
+		if ( $diff < $unitsec )
+			continue;
+
+		$numthisunits = floor( $diff / $unitsec );
+		$diff = $diff - ( $numthisunits * $unitsec );
+		$items++;
+
+		if ( $numthisunits > 0 )
+			$output[] = sprintf( _n( $unitnames[0], $unitnames[1], $numthisunits ), $numthisunits );
 	}
-	return $since;
+
+	// translators: The seperator for human_time_diff() which seperates the years, months, etc.
+	$seperator = _x( ', ', 'human_time_diff' );
+
+	if ( !empty($output) ) {
+		return implode( $seperator, $output );
+	} else {
+		$smallest = array_pop( $units );
+		return sprintf( $smallest[0], 1 );
+	}
 }
 
 /**
