views:

201

answers:

4

Convert 2010-04-16 16:30:00 to "Tomorrow Afternoon" or convert another date to "this afternoon", "next year", "next week wednesday". You get the picture. Anyone know of a PHP or Javascript library that can do this?

+3  A: 

I think you can come a long way with what is said here: http://stackoverflow.com/questions/11/how-do-i-calculate-relative-time
The logic is there, and it's not too hard to do the javascript equivalent if a solution in a different language suits you.

npup
+1  A: 

There might be more elegant solutions out there (look for Natural language formatting), but personally I couldn't find any.

I would suggest calculating the distance from now to the date you're formatting, and using thresholds.

Pseudo solution:

diff = now - date

if (diff < one_day) 
    format for today
if (diff < two_days) 
    format for tomorrow
if (diff < one_week)
    format using days from now
.
.
.

The comparison will work for both past and future dates, as long as you use compare with the abs value of diff. Display timeunit ago or timeunit from now by checking if diff is positive or negative.

For the morning, afternoon, evening etc. you only need to check for the time of day in the date, and regarding the formatting type you hit, either display the time as numbers (far away), or natural language (recent or near date).

nikc
Should be `diff = date - now` for future dates, and it's a little more complicated than that since less than a day's difference could still be tomorrow.
Duncan
Doesn't matter as long as you compare the absolute value of `diff`. But otherwise you're correct, the dates to compare to should be midnight timestamps for the treshold dates.
nikc
congrats for >1000
nik
@nik: thank you kindly.
nikc
A: 

From this link -> How do I calculate relative time?

function posted(t) { 
var now = new Date(); 
var diff = parseInt((now.getTime() - Date.parse(t)) / 1000); 
if (diff < 60) { return 'less than a minute ago'; } 
else if (diff < 120) { return 'about a minute ago'; } 
else if (diff < (2700)) { return (parseInt(diff / 60)).toString() + ' minutes ago'; } 
else if (diff < (5400)) { return 'about an hour ago'; } 
else if (diff < (86400)) { return 'about ' + (parseInt(diff / 3600)).toString() + ' hours ago'; } 
else if (diff < (172800)) { return '1 day ago'; }  
else {return (parseInt(diff / 86400)).toString() + ' days ago'; } 

}

Morten Anderson
A: 
                   function gett($sam){
                   $times = time() - $sam;
                    if ($times == 60){
                    $times = "a minute ago";
                    }
        if (($times != 1) && ($times < 60) && ($times != 0)){
        $times = "$times seconds ago";
        }
        if ($times == 0){
        $times = "less than a second ago";
        }
        if ($times == 1){
        $times = "a second ago";
        }

        if ($times > 60 && $times < 3600){
        $times = ceil($times/60)." minutes ago";
        }

        if($times == 3600){
        $times = "an hour ago";
        }
        if($times > 3600 && $times < 86400){
        $times = ceil($times/3600)." hours ago";
        }
        if($times == 86400){
        $times = "a day ago";
        }
        if($times > 86400){
        $times = ceil($times/86400)." days ago";
        }
        return $times; }

Usage: $updated = gett($timestamp); where $timestamp is pretty self-explanatory..

swatkat7