PHP Date in Human Readable Format
I’m working on a PHP project that requires human readable, relative date formatting. Below is the PHP function I’m using. The function handles past and future dates.
Sample Future Output :
- 30 seconds to go
- 1 minute to go
- 5 hours to go
- Tomorrow at 2:25pm
- June 30, 2022 5:34pm
Sample Past Output :
- 0 seconds ago
- 32 minutes ago
- 20 hours ago
- Yesterday at 5:26pm
- Monday at 10:28am
- June 25 at 5:23am
- March 30, 2010 at 5:34pm
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | public function FormatTime($timestamp) { // Get time difference and setup arrays $difference = time() - $timestamp; $periods = array("second", "minute", "hour", "day", "week", "month", "years"); $lengths = array("60","60","24","7","4.35","12"); // Past or present if ($difference >= 0) { $ending = "ago"; } else { $difference = -$difference; $ending = "to go"; } // Figure out difference by looping while less than array length // and difference is larger than lengths. $arr_len = count($lengths); for($j = 0; $j < $arr_len && $difference >= $lengths[$j]; $j++) { $difference /= $lengths[$j]; } // Round up $difference = round($difference); // Make plural if needed if($difference != 1) { $periods[$j].= "s"; } // Default format $text = "$difference $periods[$j] $ending"; // over 24 hours if($j > 2) { // future date over a day formate with year if($ending == "to go") { if($j == 3 && $difference == 1) { $text = "Tomorrow at ". date("g:i a", $timestamp); } else { $text = date("F j, Y \a\\t g:i a", $timestamp); } return $text; } if($j == 3 && $difference == 1) // Yesterday { $text = "Yesterday at ". date("g:i a", $timestamp); } else if($j == 3) // Less than a week display -- Monday at 5:28pm { $text = date("l \a\\t g:i a", $timestamp); } else if($j < 6 && !($j == 5 && $difference == 12)) // Less than a year display -- June 25 at 5:23am { $text = date("F j \a\\t g:i a", $timestamp); } else // if over a year or the same month one year ago -- June 30, 2010 at 5:34pm { $text = date("F j, Y \a\\t g:i a", $timestamp); } } return $text; } |
I love you!
I will try this in my project, see if it works, and reply back with results 🙂
I was just about to write my own and I figured something must already exist
Thanks for this nice post. Very useful. Expecting more 🙂
Simply Among d best php human readable time format tutorial on net. Seeing it at d first sight. I knew is gonna work even without trying out, cos the site itself use the the same human readeable format.
Thank you