1
\$\begingroup\$

I've written a function to take the difference between two dates and display it in a particular format. I've used a lot of if-else statements, which seems a little messy. Is there a way to shorten this up? Would using the ternary operator make sense?

$date1 = '2018-04-30 10:36:29';
$date2 = '2018-04-30 10:35:29';

echo dateDiff($date1, $date2);

function dateDiff($date1, $date2)
{
    $date_1 = new DateTime($date1);
    $date_2 = new DateTime($date2);

    $diff = $date_1->diff($date_2);

    if($diff->days > 365){
      return $date_1->format('Y-m-d');
    }

    elseif($diff->days < 366 AND $diff->days > 7){
      return $date_1->format('M d');
    }

    elseif($diff->days > 2 AND $diff->days < 8){
      return $date_1->format('L - H:i');
    }

    elseif($diff->days == 2) return "Yesterday ".$date_1->format('H:i');

    elseif($diff->days < 2 AND $diff->days > 0 OR $diff->days == 0 AND $diff->h > 1) return $date_1->format('H:i');

    elseif($diff->days == 0 AND $diff->h < 1 AND $diff->i >= 1) return $diff->i." min ago";

    elseif($diff->days == 0 AND $diff->h < 1 AND $diff->i < 1) return "just now";

    else return $error = "Error!";

}
\$\endgroup\$
3
  • \$\begingroup\$ return $error = "Error!"; why? \$\endgroup\$
    – hjpotter92
    Jan 12 '18 at 17:40
  • \$\begingroup\$ Just wrote to test the code only. @hjpotter92 \$\endgroup\$ Jan 12 '18 at 17:43
  • \$\begingroup\$ Many online sites (including this one) use the exact same feature you are trying to code. So it may prove useful to read their source code to see how they do it. This will certainly give you new ideas and you will be free to implement the one you like best. \$\endgroup\$ Jan 12 '18 at 17:48
1
\$\begingroup\$

Chained ternary expressions in PHP are a major pain in the ass — don't use them!

You have a lot of tests that are redundant, since earlier tests will have already eliminated longer periods. The error case at the end also seems pointless.

Use consistent indentation and braces for readability and safety — please don't skimp.

function dateDiff($date1, $date2)
{
    $date_1 = new DateTime($date1);
    $date_2 = new DateTime($date2);
    $diff = $date_1->diff($date_2);

    if ($diff->days > 365) {
        return $date_1->format('Y-m-d');
    } elseif ($diff->days > 7) {
        return $date_1->format('M d');
    } elseif ($diff->days > 2) {
        return $date_1->format('L - H:i');
    } elseif ($diff->days == 2) {
        return "Yesterday ".$date_1->format('H:i');
    } elseif ($diff->days > 0 OR $diff->h > 1) {
        return $date_1->format('H:i');
    } elseif ($diff->i >= 1) {
        return $diff->i." min ago";
    } else {
        return "Just now";
    }
}

Be sure to use consistent capitalization for "yesterday" and "just now".

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.