I have this function to work out the relative time that has elapsed since a certain date,
function nicetime($date) {
if(empty($date)) {
return "No date provided";
}
$periods = array("second", "minute", "hour", "day", "week", "month", "year", "decade");
$lengths = array("60","60","24","7","4.35","12","10");
$now = time();
$unix_date = strtotime($date);
// check validity of date
if(empty($unix_date)) {
return "Bad date";
}
// is it future date or past date
if($now > $unix_date) {
$difference = $now - $unix_date;
$tense = "ago";
} else {
$difference = $unix_date - $now;
$tense = "from now";
}
for($j = 0; $difference >= $lengths[$j] && $j < count($lengths)-1; $j++) {
$difference /= $lengths[$j];
}
$difference = round($difference);
if($difference != 1) {
$periods[$j].= "s";
}
return "$difference $periods[$j] {$tense}";
}
I am passing the function a date as "2011-01-16 12:30", however I am getting bad date returned which means that $unix_date is empty however if I die in the function I get the $date that is passed to the function however it gets return with a ( before it, below is how I am calling the method.
echo nicetime(date('Y:m:d G:i', $a['created_at']))
echo nicetime("2011-01-16 12:30");
works fine for me. I would suggest you ensure
$a['created_at']
is giving you what you thing it is. Maybe try
$dtDate = $a['created_at'];
$strDate = date('Y:m:d G:i', $dtDate );
echo $strDate;
echo nicetime($strDate);
Make sure $strDate is what you think it is.
Related
This question already has answers here:
Converting timestamp to time ago in PHP e.g 1 day ago, 2 days ago...
(32 answers)
Closed 6 years ago.
I am new in PHP. I am getting time difference in below time stamp code.
public function time_ago($date) {
if(empty($date)) {
return "No date provided";
}
$periods = array("second", "minute", "hour", "day", "week", "month", "year", "decade");
$lengths = array("60","60","24","7","4.35","12","10");
$now = time();
$unix_date = strtotime($date);
// check validity of date
if(empty($unix_date)) {
return "Bad date";
}
// is it future date or past date
if($now > $unix_date) {
$difference = $now - $unix_date;
$tense = "ago";
} else {
$difference = $unix_date - $now;
$tense = "from now";}
for($j = 0; $difference >= $lengths[$j] && $j < count($lengths)-1; $j++) {
$difference /= $lengths[$j];
}
$difference = round($difference);
if($difference != 1) {
$periods[$j].= "s";
}
return "$difference $periods[$j] {$tense}";
}
I am getting result 5 hours even I post now. I want result like just now or 45 secs ago or 1 min ago.
Can anyone help me to resolve this issue.
You have to set timezone of your location.
public function time_ago($date) {
date_default_timezone_set(date_default_timezone_get());
if(empty($date)) {
return "No date provided";
}
$periods = array("second", "minute", "hour", "day", "week", "month", "year", "decade");
$lengths = array("60","60","24","7","4.35","12","10");
$now = time();
$unix_date = strtotime($date);
// check validity of date
if(empty($unix_date)) {
return "Bad date";
}
// is it future date or past date
if($now > $unix_date) {
$difference = $now - $unix_date;
$tense = "ago";
} else {
$difference = $unix_date - $now;
$tense = "from now";}
for($j = 0; $difference >= $lengths[$j] && $j < count($lengths)-1; $j++) {
$difference /= $lengths[$j];
}
$difference = round($difference);
if($difference != 1) {
$periods[$j].= "s";
}
return "$difference $periods[$j] {$tense}";
}
I honestly have no idea on how to explain this, so if you look at http://www.gw2lfg.com, the elapsed time column is what I am trying to do, determine if something is a minute old, two minutes old, etc. thanks for all the help
your looking for time elapse you can do the following.
UNIX_TIMESTAMP('2012-12-01 12:12:12') - UNIX_TIMESTAMP(CURTIME());
you can then convert it into seconds and minutes.
Try this working example,
function time_ago($date)
{
if (empty($date)) { // $date=> mysql timestatmp
return "No date provided";
}
$periods = array("sec", "min", "hr", "day", "week", "month", "year", "decade");
$lengths = array("60","60","24","7");
$now = time();
$unix_date = strtotime($date);
// check validity of date
if (empty($unix_date)) {
return "Bad date";
}
// is it future date or past date
if ($now >= $unix_date) {
$difference = $now - $unix_date;
$tense = "ago";
} else {
$difference = $unix_date - $now;
$tense = "from now";
}
for ($j = 0; $difference >= $lengths[$j] && $j < count($lengths)-1; $j++) {
$difference /= $lengths[$j];
}
$difference = round($difference);
if ($difference != 1 && $j != 0) {
$periods[$j].= "s";
}
if($difference!=0)
return "$difference $periods[$j] {$tense}";
else
return "a few seconds ago";
}
Update:
Usage:
echo time_ago('2013-07-01 11:30:00'); // Output: 5 mins ago
There is this really nice function from the php.net documentation that enables you to format time in a Facebook-style manner (e.g., 2 minutes ago, 4 weeks ago, or 3 years ago).
However, I prefer the way Stackoverflow and Apple Mail does it which is generally as follows:
The current day is listed in x seconds ago or x hours ago or time (e.g, 4:35pm).
Yesterday is listed as "Yesterday".
All days after that are listed by M/D/Y.
Has anyone adapted this php.net script to do this or might share a different script that accomplishes the same goal?
<?php
function nicetime($date)
{
if(empty($date)) {
return "No date provided";
}
$periods = array("second", "minute", "hour", "day", "week", "month", "year", "decade");
$lengths = array("60","60","24","7","4.35","12","10");
$now = time();
$unix_date = strtotime($date);
// check validity of date
if(empty($unix_date)) {
return "Bad date";
}
// is it future date or past date
if($now > $unix_date) {
$difference = $now - $unix_date;
$tense = "ago";
} else {
$difference = $unix_date - $now;
$tense = "from now";
}
for($j = 0; $difference >= $lengths[$j] && $j < count($lengths)-1; $j++) {
$difference /= $lengths[$j];
}
$difference = round($difference);
if($difference != 1) {
$periods[$j].= "s";
}
return "$difference $periods[$j] {$tense}";
}
$date = "2009-03-04 17:45";
$result = nicetime($date); // 2 days ago
?>
Ok, i answered my own question.
The key is to track how many rounds of division the for loop goes through until the quotient of the current time minus the input time, $difference, divided by $jth value of the $lengths array item is less than the $j+1th value of this array.
I track this by incrementing the variable $i (notice the if/elseif/else clause demonstrating each of the 3 points I mention above) in this modified version of nicetime():
///http://php.net/manual/en/function.time.php
function nicetime($date)
{
if(empty($date)) {
return "No date provided";
}
$periods = array("second", "minute", "hour", "day", "week", "month", "year", "decade");
$lengths = array("60","60","24","7","4.35","12","10");
$now = time();
$unix_date = strtotime($date);
// check validity of date
if(empty($unix_date)) {
return "Bad date";
}
// is it future date or past date
if($now > $unix_date) {
$difference = $now - $unix_date;
$tense = "ago";
} else {
$difference = $unix_date - $now;
$tense = "from now";
}
$i=0;
for($j = 0; $difference >= $lengths[$j] && $j < count($lengths)-1; $j++) {
$i++;
$difference /= $lengths[$j];
}
$difference = round($difference);
if($difference != 1) {
$periods[$j].= "s";
}
if($i<3){
$day="$difference $periods[$j] {$tense}";
return $day;
//satisfies case #1 where time is listed as seconds, minutes, hours ago
}
elseif($i==3){
$difference == 1 && $periods[$j]=='day' ? $day='yesterday':
$day="$difference $periods[$j] {$tense}";
return $day;
//satisfies case #2 where time is listed as yesterday if not the current day
}
else{
return $date;
// satisfies case #3 where date is listed as M/D/Y if greater than a week old
}
}
echo "case#1: ".nicetime('2012-08-13 23:12:16');
echo "case#2: ".nicetime('2012-08-12 23:12:16');
echo "case#3: ".nicetime('2012-07-07 23:12:16');
Does anyone if php has built in functionally to do this?
Thanks
There is no built in function for this....but the following function will do it.
<?php
function nicetime($date)
{
if(empty($date)) {
return "No date provided";
}
$periods = array("second", "minute", "hour", "day", "week", "month", "year", "decade");
$lengths = array("60","60","24","7","4.35","12","10");
$now = time();
$unix_date = strtotime($date);
// check validity of date
if(empty($unix_date)) {
return "Bad date";
}
// is it future date or past date
if($now > $unix_date) {
$difference = $now - $unix_date;
$tense = "ago";
} else {
$difference = $unix_date - $now;
$tense = "from now";
}
for($j = 0; $difference >= $lengths[$j] && $j < count($lengths)-1; $j++) {
$difference /= $lengths[$j];
}
$difference = round($difference);
if($difference != 1) {
$periods[$j].= "s";
}
return "$difference $periods[$j] {$tense}";
}
$date = "2009-03-04 17:45";
$result = nicetime($date); // 2 days ago
?>
$date = "2009-03-04 17:45";
$result = nicetime($date);
will only return 2 Days Ago
But if u want to get results like 1 sec ago, 10 secs ago, u also need to add seconds in $date
$date = "2009-03-04 17:45:20";
$result = nicetime($date);
So when u add a fresh db entry and u refresh the page immediately, u wil get the result as 1 sec ago
here is my php code.....
<?php
function nicetime($date)
{
if(empty($date)) {
return "No date provided";
}
$periods = array("second", "minute", "hour", "day", "week", "month", "year", "decade");
$lengths = array("60","60","24","7","4.35","12","10");
$now = time();
$unix_date = strtotime($date);
// check validity of date
if(empty($unix_date)) {
return "Incorrect Date";
}
// is it future date or past date
if($now > $unix_date) {
$difference = $now - $unix_date;
$tense = "ago";
} else {
$difference = $unix_date - $now;
$tense = "ago";
}
for($j = 0; $difference >= $lengths[$j] && $j < count($lengths)-1; $j++) {
$difference /= $lengths[$j];
}
$difference = round($difference);
if($difference != 1) {
$periods[$j].= "s";
}
return "$difference $periods[$j] {$tense}";
}
?>
but it is not showing the time correctly....and if any current time is given to it is showing 25-35 seconds ago and so on....but i want to make a time difference funtion like digg.com in a format like 2 Mints AND 3 Sec ago... how can i do that
Try it to do with the other way - at the beginning multiply all $lengths values (i.e. $multiplied).
1. Divide $difference with that value.
2. If >= 1 then you have a solution.
Else divide $multiplied with the array_pop($lengths) value. Go to 2.
3. You have the solution.
I think it would be it.
BTW - $tense is always "ago".
Have a look at and learn from the Date::span and Date::fuzzy_span methods of the Kohana Date class.