conditions using Ternary Operator - php

I found this code here in this forum and I am using it. It works fine except that in french the word month is mois, so it already has an s. And it wouldn't make sense with two ss.
How do I prevent it from inserting an S if a word already ends with one?
Thanks
function time_elapsed_string($ptime)
{
$etime = time() - $ptime;
if ($etime < 1)
{
return '0 seconds';
}
$a = array( 12 * 30 * 24 * 60 * 60 => 'an',
30 * 24 * 60 * 60 => 'mois',
24 * 60 * 60 => 'jour',
60 * 60 => 'heure',
60 => 'minute',
1 => 'seconde'
);
foreach ($a as $secs => $str)
{
$d = $etime / $secs;
if ($d >= 1)
{
$r = round($d);
return $r . ' ' . $str . ($r > 1 ? 's' : '') . ' ago';
}
}
}

You can get the last character of a string by using substr() with a substring-length of -1. So just add a condition that checks whether the word ends with an "s":
return $r . ' ' . $str . ($r > 1 && substr($str, -1) != 's' ? 's' : '') . ' ago';

Related

Need to exhance a DateDiff for further detail

Currently the code below only gets as accurate as "1 month" for any date difference one month or less. What I'd like it to do is if the difference is less than one month, output how many days - "XX days". Then if it is less than one day, output how many hours - "XX hours".
Any help would be appreciated. Thanks.
function getDateDiff(timestamp) {
if (null == timestamp || timestamp == "" || timestamp == "undefined") return "?";
var splitDate = ((timestamp.toString().split('T'))[0]).split('-');
var d1 = new Date();
var d1Y = d1.getFullYear();
var d2Y = parseInt(splitDate[0], 10);
var d1M = d1.getMonth();
var d2M = parseInt(splitDate[1], 10);
var diffInMonths = (d1M + 12 * d1Y) - (d2M + 12 * d2Y);
if (diffInMonths <= 1) return "1 month";
else if (diffInMonths < 12) return diffInMonths + " months";
var diffInYears = Math.floor(diffInMonths / 12);
if (diffInYears <= 1) return "1 year";
else if (diffInYears < 12) return diffInYears + " years"
}
This is what I use with $ptime being timestamp
function ElapsedTime($ptime)
{
$etime = time() - $ptime;
if ($etime < 1)
{
return '0 seconds';
}
$a = array( 12 * 30 * 24 * 60 * 60 => 'year',
30 * 24 * 60 * 60 => 'month',
24 * 60 * 60 => 'day',
60 * 60 => 'hour',
60 => 'minute',
1 => 'second'
);
foreach ($a as $secs => $str)
{
$d = $etime / $secs;
if ($d >= 1)
{
$r = round($d);
return $r . ' ' . $str . ($r > 1 ? 's' : '') . ' ago';
}
}
}

Get normal user readable date/time with php

I know this question has been asked 2-3 times before, and I am using a function which I found in one of the answers(check it here) from those questions, but it doesnt seem to be working fine for me, i asked there in comments but didnt get any reply, so I am opening a new question here. following is the code to get plain text date/time from a datetime(mysql type).
function getElapsedTime($time_stamp)
{
$ts = convert_datetime($time_stamp);
$time_stamp = $ts;
$time_difference = strtotime('now') - $time_stamp;
if ($time_difference >= 60 * 60 * 24 * 365.242199)
{
return get_time_ago_string($time_stamp, 60 * 60 * 24 * 365.242199, 'year');
}
elseif ($time_difference >= 60 * 60 * 24 * 30.4368499)
{
return get_time_ago_string($time_stamp, 60 * 60 * 24 * 30.4368499, 'month');
}
elseif ($time_difference >= 60 * 60 * 24 * 7)
{
return get_time_ago_string($time_stamp, 60 * 60 * 24 * 7, 'week');
}
elseif ($time_difference >= 60 * 60 * 24)
{
return get_time_ago_string($time_stamp, 60 * 60 * 24, 'day');
}
elseif ($time_difference >= 60 * 60)
{
return get_time_ago_string($time_stamp, 60 * 60, 'hour');
}
elseif($time_difference <= 60)
{
return get_time_ago_string($time_stamp, 60, 'minute');
}
}
function get_time_ago_string($time_stamp, $divisor, $time_unit)
{
$time_difference = strtotime("now") - $time_stamp;
$time_units = floor($time_difference / $divisor);
settype($time_units, 'string');
if ($time_units === '0')
{
return 'less than 1 ' . $time_unit . ' ago';
}
elseif ($time_units === '1')
{
return '1 ' . $time_unit . ' ago';
}
else
{
return $time_units . ' ' . $time_unit . 's ago';
}
}
function convert_datetime($str) {
list($date, $time) = explode(' ', $str);
list($year, $month, $day) = explode('-', $date);
list($hour, $minute, $second) = explode(':', $time);
$timestamp = mktime($hour, $minute, $second, $month, $day, $year);
return $timestamp;
}
I have added one more function convert_datetime() which turns mysql datetime date into timestamp, as I thought the function getElapsedTime() is expecting timestamp, because when I was passing normal datetime date(mysql format), it wasn't working. So now, I am passing mysql datetime to getElapsedTime() and converting it into timestamp using convert_datetime() function and using it to get string.
But when the date is expected to return for "minute" or "second", its returning in negative value. eg its returning "-182 minutes ago" for "2013-05-23 15:59:58"..
Anybody knows how to get it done?
This is much simpler using PHP's DateTime classes:-
function time_ago($time_stamp)
{
$time = new DateTime($time_stamp);
$now = new DateTime();
$diff = $now->diff($time);
return $diff->format("%h hours, %i minutes ago");
}
$diff is an instance of DateInterval.
If you wish you can specify the format you are receiving in $time_stamp by using:-
$time = DateTime::createFromFormat('Your format here');
Obviously you can adjust the output format to suit.
// try this function
function time_ago($ptime) {
$ptime = strtotime($ptime);
if ($ptime) {
$etime = time() - $ptime;
if ($etime < 1)
return 'few seconds';
$a = array(
12 * 30 * 24 * 60 * 60 => 'year',
30 * 24 * 60 * 60 => 'month',
24 * 60 * 60 => 'day',
60 * 60 => 'hour',
60 => 'minute',
1 => 'second'
);
foreach ($a as $secs => $str) {
$d = $etime / $secs;
if ($d >= 1) {
$r = round($d);
return $r . ' ' . $str . ($r > 1 ? 's' : '') . '';
}
}
}
return '0';
}
// usage
echo time_ago('2013-05-23 15:59:58');
echo time_ago(date('Y:m:d H:i:s'));
// Output
43 minutes
few seconds

sql while functions

function timeago($ptime) {
$etime = time() - $ptime;
if ($etime < 1) {
return '0 seconds';
}
$a = array( 12 * 30 * 24 * 60 * 60 => 'year',
30 * 24 * 60 * 60 => 'month',
24 * 60 * 60 => 'day',
60 * 60 => 'hour',
60 => 'minute',
1 => 'second'
);
foreach ($a as $secs => $str) {
$d = $etime / $secs;
if ($d >= 1) {
$r = round($d);
return $r . ' ' . $str . ($r > 1 ? 's' : '');
}
}
}
lets say i have that function, and i have an sql result that give me an array with multiple time stamps in UNIX form. using a while loop, how can i use this function for each timestamp so each loop result would contain the time ago of each sql UNIX timestamp?
You could use DateTime class.
function timeAgo($ptime){
$date1 = DateTime::createFromFormat("s", $ptime);//HOPE THIS WILL WORK
$date2 = new DateTime("now");
$interval = $date1->diff($date2);
$diff = $interval->format('%y-%m-%d');
return $diff;
}
invoke this method on each iteration and pass in the timestamp from the DB.

converting php mysql time to seconds ago

im having a problem converting time. for some reason it seems to be defaulting back to 1970 which i believe is unix default time. im using this code, when i run the program i get 42years instead of 2 years. what am i missing. please help
here is the code
<?php
function convertime($ptime) {
$etime = time() - $ptime;
if($etime < 60) {
return 'less than minute ag';
}
$a = array(12 * 30 * 24 * 60 * 60 => 'year', 30 * 24 * 60 * 60 => 'month', 24 * 60 * 60 => 'day', 60 * 60 => 'hour', 60 => 'minute' // 1 => 'second'
);
foreach($a as $secs => $str) {
$d = $etime / $secs;
if($d >= 1) {
$r = round($d);
return $r . ' ' . $str . ($r > 1 ? 's' : '');
}
}
}
?>
<?php
$ctime = 2009-02-23 10:09:00 //time from mysql
echo convertime($ctime);
?>
Wrap strtotime() around your timestamp:
$ctime = strtotime('2009-02-23 10:09:00'); //time from mysql
http://codepad.org/HWQrLwBy
You need to compare a timestamp to a timestamp.
<?php
function convertime($ptime) {
$etime = time() - $ptime;
if($etime < 60) {
return 'less than minute ag';
}
$a = array(12 * 30 * 24 * 60 * 60 => 'year', 30 * 24 * 60 * 60 => 'month', 24 * 60 * 60 => 'day', 60 * 60 => 'hour', 60 => 'minute' // 1 => 'second'
);
foreach($a as $secs => $str) {
$d = $etime / $secs;
if($d >= 1) {
$r = round($d);
return $r . ' ' . $str . ($r > 1 ? 's' : '');
}
}
}
?>
<?php
$ctime = strtotime('2009-02-23 10:09:00'); //time from mysql
echo convertime($ctime);
?>
try it

PHP How to find the time elapsed since a date time? [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 7 years ago.
How to find the time elapsed since a date time stamp like 2010-04-28 17:25:43, final out put text should be like xx Minutes Ago/xx Days Ago
Most of the answers seem focused around converting the date from a string to time. It seems you're mostly thinking about getting the date into the '5 days ago' format, etc.. right?
This is how I'd go about doing that:
$time = strtotime('2010-04-28 17:25:43');
echo 'event happened '.humanTiming($time).' ago';
function humanTiming ($time)
{
$time = time() - $time; // to get the time since that moment
$time = ($time<1)? 1 : $time;
$tokens = array (
31536000 => 'year',
2592000 => 'month',
604800 => 'week',
86400 => 'day',
3600 => 'hour',
60 => 'minute',
1 => 'second'
);
foreach ($tokens as $unit => $text) {
if ($time < $unit) continue;
$numberOfUnits = floor($time / $unit);
return $numberOfUnits.' '.$text.(($numberOfUnits>1)?'s':'');
}
}
I haven't tested that, but it should work.
The result would look like
event happened 4 days ago
or
event happened 1 minute ago
Want to share php function which results in grammatically correct Facebook like human readable time format.
Example:
echo get_time_ago(strtotime('now'));
Result:
less than 1 minute ago
function get_time_ago($time_stamp)
{
$time_difference = strtotime('now') - $time_stamp;
if ($time_difference >= 60 * 60 * 24 * 365.242199)
{
/*
* 60 seconds/minute * 60 minutes/hour * 24 hours/day * 365.242199 days/year
* This means that the time difference is 1 year or more
*/
return get_time_ago_string($time_stamp, 60 * 60 * 24 * 365.242199, 'year');
}
elseif ($time_difference >= 60 * 60 * 24 * 30.4368499)
{
/*
* 60 seconds/minute * 60 minutes/hour * 24 hours/day * 30.4368499 days/month
* This means that the time difference is 1 month or more
*/
return get_time_ago_string($time_stamp, 60 * 60 * 24 * 30.4368499, 'month');
}
elseif ($time_difference >= 60 * 60 * 24 * 7)
{
/*
* 60 seconds/minute * 60 minutes/hour * 24 hours/day * 7 days/week
* This means that the time difference is 1 week or more
*/
return get_time_ago_string($time_stamp, 60 * 60 * 24 * 7, 'week');
}
elseif ($time_difference >= 60 * 60 * 24)
{
/*
* 60 seconds/minute * 60 minutes/hour * 24 hours/day
* This means that the time difference is 1 day or more
*/
return get_time_ago_string($time_stamp, 60 * 60 * 24, 'day');
}
elseif ($time_difference >= 60 * 60)
{
/*
* 60 seconds/minute * 60 minutes/hour
* This means that the time difference is 1 hour or more
*/
return get_time_ago_string($time_stamp, 60 * 60, 'hour');
}
else
{
/*
* 60 seconds/minute
* This means that the time difference is a matter of minutes
*/
return get_time_ago_string($time_stamp, 60, 'minute');
}
}
function get_time_ago_string($time_stamp, $divisor, $time_unit)
{
$time_difference = strtotime("now") - $time_stamp;
$time_units = floor($time_difference / $divisor);
settype($time_units, 'string');
if ($time_units === '0')
{
return 'less than 1 ' . $time_unit . ' ago';
}
elseif ($time_units === '1')
{
return '1 ' . $time_unit . ' ago';
}
else
{
/*
* More than "1" $time_unit. This is the "plural" message.
*/
// TODO: This pluralizes the time unit, which is done by adding "s" at the end; this will not work for i18n!
return $time_units . ' ' . $time_unit . 's ago';
}
}
I think I have a function which should do what you want:
function time2string($timeline) {
$periods = array('day' => 86400, 'hour' => 3600, 'minute' => 60, 'second' => 1);
foreach($periods AS $name => $seconds){
$num = floor($timeline / $seconds);
$timeline -= ($num * $seconds);
$ret .= $num.' '.$name.(($num > 1) ? 's' : '').' ';
}
return trim($ret);
}
Simply apply it to the difference between time() and strtotime('2010-04-28 17:25:43') as so:
print time2string(time()-strtotime('2010-04-28 17:25:43')).' ago';
To improve upon #arnorhs answer I've added in the ability to have a more precise result so if you wanted years, months, days & hours for instance since the user joined.
I've added a new parameter to allow you to specify the number of points of precision you wish to have returned.
function get_friendly_time_ago($distant_timestamp, $max_units = 3) {
$i = 0;
$time = time() - $distant_timestamp; // to get the time since that moment
$tokens = [
31536000 => 'year',
2592000 => 'month',
604800 => 'week',
86400 => 'day',
3600 => 'hour',
60 => 'minute',
1 => 'second'
];
$responses = [];
while ($i < $max_units && $time > 0) {
foreach ($tokens as $unit => $text) {
if ($time < $unit) {
continue;
}
$i++;
$numberOfUnits = floor($time / $unit);
$responses[] = $numberOfUnits . ' ' . $text . (($numberOfUnits > 1) ? 's' : '');
$time -= ($unit * $numberOfUnits);
break;
}
}
if (!empty($responses)) {
return implode(', ', $responses) . ' ago';
}
return 'Just now';
}
If you use the php Datetime class you could use:
function time_ago(Datetime $date) {
$time_ago = '';
$diff = $date->diff(new Datetime('now'));
if (($t = $diff->format("%m")) > 0)
$time_ago = $t . ' months';
else if (($t = $diff->format("%d")) > 0)
$time_ago = $t . ' days';
else if (($t = $diff->format("%H")) > 0)
$time_ago = $t . ' hours';
else
$time_ago = 'minutes';
return $time_ago . ' ago (' . $date->format('M j, Y') . ')';
}
Be warned, the majority of the mathematically calculated examples have a hard limit of 2038-01-18 dates and will not work with fictional dates.
As there was a lack of DateTime and DateInterval based examples, I wanted to provide a multi-purpose function that satisfies the OP's need and others wanting compound elapsed periods, such as 1 month 2 days ago. Along with a bunch of other use cases, such as a limit to display the date instead of the elapsed time, or to filter out portions of the elapsed time result.
Additionally the majority of the examples assume elapsed is from the current time, where the below function allows for it to be overridden with the desired end date.
/**
* multi-purpose function to calculate the time elapsed between $start and optional $end
* #param string|null $start the date string to start calculation
* #param string|null $end the date string to end calculation
* #param string $suffix the suffix string to include in the calculated string
* #param string $format the format of the resulting date if limit is reached or no periods were found
* #param string $separator the separator between periods to use when filter is not true
* #param null|string $limit date string to stop calculations on and display the date if reached - ex: 1 month
* #param bool|array $filter false to display all periods, true to display first period matching the minimum, or array of periods to display ['year', 'month']
* #param int $minimum the minimum value needed to include a period
* #return string
*/
function elapsedTimeString($start, $end = null, $limit = null, $filter = true, $suffix = 'ago', $format = 'Y-m-d', $separator = ' ', $minimum = 1)
{
$dates = (object) array(
'start' => new DateTime($start ? : 'now'),
'end' => new DateTime($end ? : 'now'),
'intervals' => array('y' => 'year', 'm' => 'month', 'd' => 'day', 'h' => 'hour', 'i' => 'minute', 's' => 'second'),
'periods' => array()
);
$elapsed = (object) array(
'interval' => $dates->start->diff($dates->end),
'unknown' => 'unknown'
);
if ($elapsed->interval->invert === 1) {
return trim('0 seconds ' . $suffix);
}
if (false === empty($limit)) {
$dates->limit = new DateTime($limit);
if (date_create()->add($elapsed->interval) > $dates->limit) {
return $dates->start->format($format) ? : $elapsed->unknown;
}
}
if (true === is_array($filter)) {
$dates->intervals = array_intersect($dates->intervals, $filter);
$filter = false;
}
foreach ($dates->intervals as $period => $name) {
$value = $elapsed->interval->$period;
if ($value >= $minimum) {
$dates->periods[] = vsprintf('%1$s %2$s%3$s', array($value, $name, ($value !== 1 ? 's' : '')));
if (true === $filter) {
break;
}
}
}
if (false === empty($dates->periods)) {
return trim(vsprintf('%1$s %2$s', array(implode($separator, $dates->periods), $suffix)));
}
return $dates->start->format($format) ? : $elapsed->unknown;
}
One thing to note - the retrieved intervals for the supplied filter values do not carry over to the next period. The filter merely displays the resulting value of the supplied periods and does not recalculate the periods to display only the desired filter total.
Usage
For the OP's need of displaying the highest period (as of 2015-02-24).
echo elapsedTimeString('2010-04-26');
/** 4 years ago */
To display compound periods and supply a custom end date (note the lack of time supplied and fictional dates).
echo elapsedTimeString('1920-01-01', '2500-02-24', null, false);
/** 580 years 1 month 23 days ago */
To display the result of filtered periods (ordering of array doesn't matter).
echo elapsedTimeString('2010-05-26', '2012-02-24', null, ['month', 'year']);
/** 1 year 8 months ago */
To display the start date in the supplied format (default Y-m-d) if the limit is reached.
echo elapsedTimeString('2010-05-26', '2012-02-24', '1 year');
/** 2010-05-26 */
There are bunch of other use cases. It can also easily be adapted to accept unix timestamps and/or DateInterval objects for the start, end, or limit arguments.
One option that'll work with any version of PHP is to do what's already been suggested, which is something like this:
$eventTime = '2010-04-28 17:25:43';
$age = time() - strtotime($eventTime);
That will give you the age in seconds. From there, you can display it however you wish.
One problem with this approach, however, is that it won't take into account time shifts causes by DST. If that's not a concern, then go for it. Otherwise, you'll probably want to use the diff() method in the DateTime class. Unfortunately, this is only an option if you're on at least PHP 5.3.
I liked Mithun's code, but I tweaked it a bit to make it give more reasonable answers.
function getTimeSince($eventTime)
{
$totaldelay = time() - strtotime($eventTime);
if($totaldelay <= 0)
{
return '';
}
else
{
$first = '';
$marker = 0;
if($years=floor($totaldelay/31536000))
{
$totaldelay = $totaldelay % 31536000;
$plural = '';
if ($years > 1) $plural='s';
$interval = $years." year".$plural;
$timesince = $timesince.$first.$interval;
if ($marker) return $timesince;
$marker = 1;
$first = ", ";
}
if($months=floor($totaldelay/2628000))
{
$totaldelay = $totaldelay % 2628000;
$plural = '';
if ($months > 1) $plural='s';
$interval = $months." month".$plural;
$timesince = $timesince.$first.$interval;
if ($marker) return $timesince;
$marker = 1;
$first = ", ";
}
if($days=floor($totaldelay/86400))
{
$totaldelay = $totaldelay % 86400;
$plural = '';
if ($days > 1) $plural='s';
$interval = $days." day".$plural;
$timesince = $timesince.$first.$interval;
if ($marker) return $timesince;
$marker = 1;
$first = ", ";
}
if ($marker) return $timesince;
if($hours=floor($totaldelay/3600))
{
$totaldelay = $totaldelay % 3600;
$plural = '';
if ($hours > 1) $plural='s';
$interval = $hours." hour".$plural;
$timesince = $timesince.$first.$interval;
if ($marker) return $timesince;
$marker = 1;
$first = ", ";
}
if($minutes=floor($totaldelay/60))
{
$totaldelay = $totaldelay % 60;
$plural = '';
if ($minutes > 1) $plural='s';
$interval = $minutes." minute".$plural;
$timesince = $timesince.$first.$interval;
if ($marker) return $timesince;
$first = ", ";
}
if($seconds=floor($totaldelay/1))
{
$totaldelay = $totaldelay % 1;
$plural = '';
if ($seconds > 1) $plural='s';
$interval = $seconds." second".$plural;
$timesince = $timesince.$first.$interval;
}
return $timesince;
}
}
Convert [saved_date] to timestamp. Get current timestamp.
current timestamp - [saved_date] timestamp.
Then you can format it with date();
You can normally convert most date formats to timestamps with the strtotime() function.
Use This one and you can get the
$previousDate = '2013-7-26 17:01:10';
$startdate = new DateTime($previousDate);
$endDate = new DateTime('now');
$interval = $endDate->diff($startdate);
echo$interval->format('%y years, %m months, %d days');
Refer this
http://ca2.php.net/manual/en/dateinterval.format.php
Try one of these repos:
https://github.com/salavert/time-ago-in-words
https://github.com/jimmiw/php-time-ago
I just started using the latter, does the trick, but no stackoverflow-style fallback on exact date when the date in question is too far away, nor is there support for future dates - and the API is a little funky, but at least it works seemingly flawlessly and is maintained...
To find out time elapsed i usually use time() instead of date() and formatted time stamps.
Then get the difference between the latter value and the earlier value and format accordingly. time() is differently not a replacement for date() but it totally helps when calculating elapsed time.
example:
The value of time() looks something like this 1274467343 increments every second. So you could have $erlierTime with value 1274467343 and $latterTime with value 1274467500, then just do $latterTime - $erlierTime to get time elapsed in seconds.
Wrote my own
function getElapsedTime($eventTime)
{
$totaldelay = time() - strtotime($eventTime);
if($totaldelay <= 0)
{
return '';
}
else
{
if($days=floor($totaldelay/86400))
{
$totaldelay = $totaldelay % 86400;
return $days.' days ago.';
}
if($hours=floor($totaldelay/3600))
{
$totaldelay = $totaldelay % 3600;
return $hours.' hours ago.';
}
if($minutes=floor($totaldelay/60))
{
$totaldelay = $totaldelay % 60;
return $minutes.' minutes ago.';
}
if($seconds=floor($totaldelay/1))
{
$totaldelay = $totaldelay % 1;
return $seconds.' seconds ago.';
}
}
}
Here I am using custom function for finding the time elapsed since a date time.
echo Datetodays('2013-7-26 17:01:10');
function Datetodays($d) {
$date_start = $d;
$date_end = date('Y-m-d H:i:s');
define('SECOND', 1);
define('MINUTE', SECOND * 60);
define('HOUR', MINUTE * 60);
define('DAY', HOUR * 24);
define('WEEK', DAY * 7);
$t1 = strtotime($date_start);
$t2 = strtotime($date_end);
if ($t1 > $t2) {
$diffrence = $t1 - $t2;
} else {
$diffrence = $t2 - $t1;
}
//echo "".$date_end." ".$date_start." ".$diffrence;
$results['major'] = array(); // whole number representing larger number in date time relationship
$results1 = array();
$string = '';
$results['major']['weeks'] = floor($diffrence / WEEK);
$results['major']['days'] = floor($diffrence / DAY);
$results['major']['hours'] = floor($diffrence / HOUR);
$results['major']['minutes'] = floor($diffrence / MINUTE);
$results['major']['seconds'] = floor($diffrence / SECOND);
//print_r($results);
// Logic:
// Step 1: Take the major result and transform it into raw seconds (it will be less the number of seconds of the difference)
// ex: $result = ($results['major']['weeks']*WEEK)
// Step 2: Subtract smaller number (the result) from the difference (total time)
// ex: $minor_result = $difference - $result
// Step 3: Take the resulting time in seconds and convert it to the minor format
// ex: floor($minor_result/DAY)
$results1['weeks'] = floor($diffrence / WEEK);
$results1['days'] = floor((($diffrence - ($results['major']['weeks'] * WEEK)) / DAY));
$results1['hours'] = floor((($diffrence - ($results['major']['days'] * DAY)) / HOUR));
$results1['minutes'] = floor((($diffrence - ($results['major']['hours'] * HOUR)) / MINUTE));
$results1['seconds'] = floor((($diffrence - ($results['major']['minutes'] * MINUTE)) / SECOND));
//print_r($results1);
if ($results1['weeks'] != 0 && $results1['days'] == 0) {
if ($results1['weeks'] == 1) {
$string = $results1['weeks'] . ' week ago';
} else {
if ($results1['weeks'] == 2) {
$string = $results1['weeks'] . ' weeks ago';
} else {
$string = '2 weeks ago';
}
}
} elseif ($results1['weeks'] != 0 && $results1['days'] != 0) {
if ($results1['weeks'] == 1) {
$string = $results1['weeks'] . ' week ago';
} else {
if ($results1['weeks'] == 2) {
$string = $results1['weeks'] . ' weeks ago';
} else {
$string = '2 weeks ago';
}
}
} elseif ($results1['weeks'] == 0 && $results1['days'] != 0) {
if ($results1['days'] == 1) {
$string = $results1['days'] . ' day ago';
} else {
$string = $results1['days'] . ' days ago';
}
} elseif ($results1['days'] != 0 && $results1['hours'] != 0) {
$string = $results1['days'] . ' day and ' . $results1['hours'] . ' hours ago';
} elseif ($results1['days'] == 0 && $results1['hours'] != 0) {
if ($results1['hours'] == 1) {
$string = $results1['hours'] . ' hour ago';
} else {
$string = $results1['hours'] . ' hours ago';
}
} elseif ($results1['hours'] != 0 && $results1['minutes'] != 0) {
$string = $results1['hours'] . ' hour and ' . $results1['minutes'] . ' minutes ago';
} elseif ($results1['hours'] == 0 && $results1['minutes'] != 0) {
if ($results1['minutes'] == 1) {
$string = $results1['minutes'] . ' minute ago';
} else {
$string = $results1['minutes'] . ' minutes ago';
}
} elseif ($results1['minutes'] != 0 && $results1['seconds'] != 0) {
$string = $results1['minutes'] . ' minute and ' . $results1['seconds'] . ' seconds ago';
} elseif ($results1['minutes'] == 0 && $results1['seconds'] != 0) {
if ($results1['seconds'] == 1) {
$string = $results1['seconds'] . ' second ago';
} else {
$string = $results1['seconds'] . ' seconds ago';
}
}
return $string;
}
?>
You can get a function for this directly form WordPress core files take a look here
http://core.trac.wordpress.org/browser/tags/3.6/wp-includes/formatting.php#L2121
function human_time_diff( $from, $to = '' ) {
if ( empty( $to ) )
$to = time();
$diff = (int) abs( $to - $from );
if ( $diff < HOUR_IN_SECONDS ) {
$mins = round( $diff / MINUTE_IN_SECONDS );
if ( $mins <= 1 )
$mins = 1;
/* translators: min=minute */
$since = sprintf( _n( '%s min', '%s mins', $mins ), $mins );
} elseif ( $diff < DAY_IN_SECONDS && $diff >= HOUR_IN_SECONDS ) {
$hours = round( $diff / HOUR_IN_SECONDS );
if ( $hours <= 1 )
$hours = 1;
$since = sprintf( _n( '%s hour', '%s hours', $hours ), $hours );
} elseif ( $diff < WEEK_IN_SECONDS && $diff >= DAY_IN_SECONDS ) {
$days = round( $diff / DAY_IN_SECONDS );
if ( $days <= 1 )
$days = 1;
$since = sprintf( _n( '%s day', '%s days', $days ), $days );
} elseif ( $diff < 30 * DAY_IN_SECONDS && $diff >= WEEK_IN_SECONDS ) {
$weeks = round( $diff / WEEK_IN_SECONDS );
if ( $weeks <= 1 )
$weeks = 1;
$since = sprintf( _n( '%s week', '%s weeks', $weeks ), $weeks );
} elseif ( $diff < YEAR_IN_SECONDS && $diff >= 30 * DAY_IN_SECONDS ) {
$months = round( $diff / ( 30 * DAY_IN_SECONDS ) );
if ( $months <= 1 )
$months = 1;
$since = sprintf( _n( '%s month', '%s months', $months ), $months );
} elseif ( $diff >= YEAR_IN_SECONDS ) {
$years = round( $diff / YEAR_IN_SECONDS );
if ( $years <= 1 )
$years = 1;
$since = sprintf( _n( '%s year', '%s years', $years ), $years );
}
return $since;
}
Improvisation to the function "humanTiming" by arnorhs. It would calculate a "fully stretched" translation of time string to human readable text version. For example to say it like "1 week 2 days 1 hour 28 minutes 14 seconds"
function humantime ($oldtime, $newtime = null, $returnarray = false) {
if(!$newtime) $newtime = time();
$time = $newtime - $oldtime; // to get the time since that moment
$tokens = array (
31536000 => 'year',
2592000 => 'month',
604800 => 'week',
86400 => 'day',
3600 => 'hour',
60 => 'minute',
1 => 'second'
);
$htarray = array();
foreach ($tokens as $unit => $text) {
if ($time < $unit) continue;
$numberOfUnits = floor($time / $unit);
$htarray[$text] = $numberOfUnits.' '.$text.(($numberOfUnits>1)?'s':'');
$time = $time - ( $unit * $numberOfUnits );
}
if($returnarray) return $htarray;
return implode(' ', $htarray);
}
Had to do this recently - hope this helps someone. It doesn't cater for every possibility, but met my needs for a project.
https://github.com/duncanheron/twitter_date_format
https://github.com/duncanheron/twitter_date_format/blob/master/twitter_date_format.php

Categories