tags:

views:

144

answers:

4

Hi

I want to convert a date string like "19.11.2009 14:00" into the age of it now like "for 2 minutes" or "for 1 week" or "for 2 days"

Is there some code around?

+4  A: 

Something like this

define('MINUTE',60);
define('HOUR',60*MINUTE);
define('DAY',24*HOUR);
define('WEEK',7*DAY);
define('MONTH',30*DAY);

$pastDate=strtotime($dateString);
$seconds=time()-$pastDate;
if ($seconds>MONTH)
  return $seconds/MONTH . " months";
if ($seconds>WEEK)
  return $seconds/WEEK . " weeks";
if ($seconds>DAY)
  return $seconds/DAY . " days";
if ($seconds>HOUR)
  return $seconds/HOUR . " hours";
if ($seconds>MINUTE)
  return $seconds/MINUTE . " minutes";
return $seconds . " seconds";
yu_sha
Month increment is like a rounding error.
Tchalvak
It probably does not matter. If it does, OP can probably calculate with better precision (365.25/12 or whatever)
yu_sha
+3  A: 
$dateString = strtotime('19.11.2009 14.00');
$now = time();

$time = $dateString - $time;

if($time > 60 && $time < 3600) echo $time/60.' minutes remaining';
else if($time > 3600 && $time < 86400) echo $time/3600.' hours remaining';
else if($time > 86400 && $time < 604800) echo $time/86400.' days remaining';
else if($time > 604800 && $time < 18144000) echo $time/604800.' weeks remaining';
else if($time > 18144000 && $time < 217728000) echo $time/18144000.' months remaining';
else if($time > 217728000) echo $time/217728000.' years remaining';
dfilkovi
Don't you mean `$time = $dateString - $now;`?
ApoY2k
Yep, sorry, quick typing.
dfilkovi
+4  A: 

If you're in PHP 5.3 you could also use DateTime:diff.

$start = new DateTime('now');
$time_span = $start->diff(new DateTime($dateString));
var_dump($time_span);
Sergi
+1  A: 

This may not be 100% what you want obviously -- others have given you great answers -- but something like this may be a good alternative to a "human readable" date format.

I dug this up from some code I used quite a while ago. I haven't tested this in a while, but last I remember it worked great. I wanted to replicate something like what Facebook uses, like "5 seconds ago", but it also works for the future, using "in ..." instead of "... ago". You can probably modify this to get as much or as little detail as you want.

/**
 * Returns the amount of time that has passed from the current date
 * or the amount of time from the current date until the specified date
 *
 * Returns in the form of a partial sentence. Some examples:
 *
 * In 25 days
 * Tomorrow
 * Yesterday
 * 4 months ago
 * Next month
 * Last month
 * (etc)
 *
 * @param string $date
 * @return string
 */
public static function calculateHowLong($date) {
  // start by converting to unix time
  $when = date("U", strtotime($date));
  $isPast = ($when < time());

  $how_long = abs(time() - $when);
  if ($how_long < 60) {
    $return =  "{$how_long} seconds";
    if ($isPast) $return .= " ago"; else $return = "In {$return}";

  } elseif ($how_long < 60 * 60) {
    $return =  (int) ($how_long / 60) . " minutes";
    if ($isPast) $return .= " ago"; else $return = "In {$return}";

  } elseif ($how_long < 60 * 60 * 24) {
    $return =  (int) ($how_long / (60 * 60)) . " hours";
    if ($isPast) $return .= " ago"; else $return = "In {$return}";

  } elseif ($how_long < 60 * 60 * 24 * 2) {
    if ($isPast) $return = "Yesterday"; else $return = "Tomorrow";

  } elseif ($how_long < 60 * 60 * 24 * 7) {
    $return =  (int) ($how_long / (60 * 60 * 24)) . " days";
    if ($isPast) $return .= " ago"; else $return = "In {$return}";

  } elseif ($how_long < 60 * 60 * 24 * 13) {
    if ($isPast) $return = "Last week"; else $return = "Next week";

  } elseif ($how_long < 60 * 60 * 24 * 7 * 4) {
    $return =  (int) ($how_long / (60 * 60 * 24 * 7)) . " weeks";
    if ($isPast) $return .= " ago"; else $return = "In {$return}";

  } elseif ($how_long < 60 * 60 * 24 * 30 * 2) {
    if ($isPast) $return = "Last month"; else $return = "Next month";

  } elseif ($how_long < 60 * 60 * 24 * 30 * 12) {
    $return =  (int) ($how_long / (60 * 60 * 24 * 30)) . " months";
    if ($isPast) $return .= " ago"; else $return = "In {$return}";

  } else {
    if ($isPast) $return = "More than 1 year ago"; else $return = "In more than 1 year";
  }

  return $return;
}

It's probably a little sloppy, but feel free to make it better.

theotherlight