Pretty / Fuzzy Date

A function to get a 'fuzzy' textual date

<?
function prettyDate($ts) {
	$s = date("m.d.Y", $ts);
	$now = time();
	
	if ($now > $ts) {
		$diff = round($now-$ts);
		$numMins = round($diff/60);
		$numHours = round($numMins/60);
		$numDays = round($numHours/24);
		$numWeeks = round($numDays/7);
		$numMonths = round($numWeeks/4.33);
		$numYears = round($numMonths/12);
		
		if (($diff < 60) || ($numMins <= 1)) {
			$s = "1 minute ago";
		} elseif ($numHours == 0) {
			$s = $numMins . " minutes ago";
		} elseif ($numDays == 0) {
			if ($numHours > 1) {
				$s = $numHours . " hours ago";
			} else {
				$s = "1 hour ago";
			}
		} elseif ($numWeeks == 0) {
			if ($numDays > 1) {
				$s = $numDays . " days ago";
			} else {
				$s = "Yesterday";
			}
		} elseif ($numMonths == 0) {
			if ($numWeeks > 1) {
				$s = $numWeeks . " weeks ago";
			} else {
				$s = "Last week";
			}
		} else {
			if ($numMonths > 1) {
				$s = $numMonths . " months ago";
			} elseif ($numMonths <= 3) {
				$s = $numMonths .= " months ago";
			} else {
				$s = "Over 3 months ago";
			}
		}
	} else {
		$diff = ($ts - $now);
		$numMins = ($diff/60);
		$numHours = round($numMins/60);
		$numDays = round($numHours/24);
		$numWeeks = round($numDays/7);
		$numMonths = round($numWeeks/4.33);
		$numYears = round($numMonths/12);
		
		if ($numDays == 0) {
			$s = "Today";
		} elseif ($numDays == 1) {
			$s = "Tomorrow";
		} elseif ($numWeeks == 0) {
			$s = $numDays . " days";
		} elseif ($numWeeks == 1) {
			$s = "Next Week";
		} elseif ($numMonths == 0) {
			$s = $numWeeks . " weeks";
		} elseif ($numMonths == 1) {
			$s = "Next Month";
		} elseif ($numYears <= 0) {
			$s = $numMonths . " months";
		} elseif ($numYears == 1) {
			$s = "Next Year";
		} else {
			$s = "Over a year";
		}
	}
	
	return $s;
}
?>

Usage

just pass a standard unix timestamp to the function and echo the return value to show textual dates (eg: Yesterday, 3 hours ago, Last week, Tomorrow)


Comments

Add your comment