?
Solved

PHP count back from "NOW" to a date in this format "2015-01-22 17:57:51"

Posted on 2015-02-05
3
Medium Priority
?
76 Views
Last Modified: 2015-02-05
Hi

I have a date in the following format 2015-01-22 17:57:51 and I want to be able to count this down from "now" and present something like this:

if it's only minutes:
something like:   "23 minutes ago"

if it's hours and minutes (but less than a day):
something like:  "1 hour 23 mins ago"

if it's days, hours and minutes
something like:  "2 days 1 hour 23 mins ago"
0
Comment
Question by:Neil Thompson
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
3 Comments
 
LVL 36

Accepted Solution

by:
Kimputer earned 2000 total points
ID: 40590912
<?php 
function get_timespan_string($older, $newer) { 
  $Y1 = $older->format('Y'); 
  $Y2 = $newer->format('Y'); 
  $Y = $Y2 - $Y1; 

  $m1 = $older->format('m'); 
  $m2 = $newer->format('m'); 
  $m = $m2 - $m1; 

  $d1 = $older->format('d'); 
  $d2 = $newer->format('d'); 
  $d = $d2 - $d1; 

  $H1 = $older->format('H'); 
  $H2 = $newer->format('H'); 
  $H = $H2 - $H1; 

  $i1 = $older->format('i'); 
  $i2 = $newer->format('i'); 
  $i = $i2 - $i1; 

  $s1 = $older->format('s'); 
  $s2 = $newer->format('s'); 
  $s = $s2 - $s1; 

  if($s < 0) { 
    $i = $i -1; 
    $s = $s + 60; 
  } 
  if($i < 0) { 
    $H = $H - 1; 
    $i = $i + 60; 
  } 
  if($H < 0) { 
    $d = $d - 1; 
    $H = $H + 24; 
  } 
  if($d < 0) { 
    $m = $m - 1; 
    $d = $d + get_days_for_previous_month($m2, $Y2); 
  } 
  if($m < 0) { 
    $Y = $Y - 1; 
    $m = $m + 12; 
  } 
  $timespan_string = create_timespan_string($Y, $m, $d, $H, $i, $s); 
  return $timespan_string; 
} 

function get_days_for_previous_month($current_month, $current_year) { 
  $previous_month = $current_month - 1; 
  if($current_month == 1) { 
    $current_year = $current_year - 1; //going from January to previous December 
    $previous_month = 12; 
  } 
  if($previous_month == 11 || $previous_month == 9 || $previous_month == 6 || $previous_month == 4) { 
    return 30; 
  } 
  else if($previous_month == 2) { 
    if(($current_year % 4) == 0) { //remainder 0 for leap years 
      return 29; 
    } 
    else { 
      return 28; 
    } 
  } 
  else { 
    return 31; 
  } 
} 

function create_timespan_string($Y, $m, $d, $H, $i, $s) 
{ 
  $timespan_string = ''; 
  $found_first_diff = false; 
  if($Y >= 1) { 
    $found_first_diff = true; 
    $timespan_string .= pluralize($Y, 'year').' '; 
  } 
  if($m >= 1 || $found_first_diff) { 
    $found_first_diff = true; 
    $timespan_string .= pluralize($m, 'month').' '; 
  } 
  if($d >= 1 || $found_first_diff) { 
    $found_first_diff = true; 
    $timespan_string .= pluralize($d, 'day').' '; 
  } 
  if($H >= 1 || $found_first_diff) { 
    $found_first_diff = true; 
    $timespan_string .= pluralize($H, 'hour').' '; 
  } 
  if($i >= 1 || $found_first_diff) { 
    $found_first_diff = true; 
    $timespan_string .= pluralize($i, 'minute').' '; 
  } 
  if($found_first_diff) { 
    $timespan_string .= 'and '; 
  } 
  $timespan_string .= pluralize($s, 'second'); 
  return $timespan_string; 
} 

function pluralize( $count, $text ) 
{ 
  return $count . ( ( $count == 1 ) ? ( " $text" ) : ( " ${text}s" ) ); 
} 

date_default_timezone_set('Europe/Amsterdam');

$date1 = new DateTime("2015-01-22 17:57:51");
$date2 = new DateTime("now");

echo get_timespan_string($date1,$date2);


?>

Open in new window

0
 
LVL 3

Author Closing Comment

by:Neil Thompson
ID: 40590969
Wow, many thanks Kimputer :)
0
 
LVL 111

Expert Comment

by:Ray Paseur
ID: 40592713
For future reference, you may want to search the E-E articles before you post a question.  You can find this and much more about how to handle datetime values in PHP here:
http://www.experts-exchange.com/Web_Development/Web_Languages-Standards/PHP/A_201-Handling-date-and-time-in-PHP-and-MySQL.html

Sample, implementing the Practical Application #3 in the Article:
http://iconoun.com/demo/temp_neilt.php
0

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Author Note: Since this E-E article was originally written, years ago, formal testing has come into common use in the world of PHP.  PHPUnit (http://en.wikipedia.org/wiki/PHPUnit) and similar technologies have enjoyed wide adoption, making it possib…
Many old projects have bad code, but the budget doesn't exist to rewrite the codebase. You can update this code to be safer by introducing contemporary input validation, sanitation, and safer database queries.
The viewer will learn how to create and use a small PHP class to apply a watermark to an image. This video shows the viewer the setup for the PHP watermark as well as important coding language. Continue to Part 2 to learn the core code used in creat…
This tutorial will teach you the core code needed to finalize the addition of a watermark to your image. The viewer will use a small PHP class to learn and create a watermark.
Suggested Courses

777 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question