php time difference script problem - php

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.

Related

Timestamp error in php [duplicate]

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}";
}

PHP/MySql Determining age/Elapsed Time of inserted data

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

PHP: formatting time Stackoverflow or Apple Mail-style

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');

php relative time problems

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.

converting a timestamp to "X second(s) ago", "X minute(s) ago", "X hour(s) ago" etc

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

Categories