Ημέρες – Μήνες – Έτη (php)

Λίγος κώδικας σε PHP που επιστρέφει τη διαφορά δύο ημερομηνιών σε Ημέρες – Μήνες – Έτη, αφού οι DateTime::Diff() και date_diff() που παρέχει η PHP τα κάνουν μαντάρα.
Για συντομία και καθαρότητα του κώδικα δεν μπήκαν έλεγχοι με ποια σειρά έχουν δοθεί οι ημερομηνίες, οπότε περιμένει να είναι πρώτα η παλαιότερη και μετά η μεταγενέστερη.

function dmydiff($dateS, $dateE)
{
    $dS = getdate($dateS);
    $dE = getdate($dateE);

    $DMY = array('Y'=>0, 'M'=>0, 'D'=>0);

    $DMY['Y'] = $dE['year'] - $dS['year'];
    $DMY['M'] = $dE['mon'] - $dS['mon'];
    $DMY['D'] = $dE['mday'] - $dS['mday'];

    if ($DMY['D'] < 0)
    {
        $dT = mktime(0,0,0,$dS['mon']+1,1,$dS['year']);
        $dT = intval(($dT - $dateS) / (24*60*60));
        $DMY['D'] =  $dT + $dE['mday'] - 1;
        $DMY['M']--;
    }
    if ($DMY['M'] < 0)
    {
        $DMY['Y']--;
        $DMY['M'] += 12;
    }

    return $DMY;
}

Ο δοκιμαστικός κώδικας που φαίνεται παρακάτω βγάζει τα εξής αποτελέσματα.

Start Date: 31/01/2012
End Date  : 20/03/2013

Using DateTime::Diff() or date_diff() functions
Years  : 1
Months : 1
Days   : 17

Using custom PHP Source code
Years  : 1
Months : 1
Days   : 20

Και τέλος ο κώδικας…

<?php
header('Content-type: text/plain');
date_default_timezone_set('Europe/Athens');

//----------------------------------------------------------------------------
$dtStart = mktime(0,0,0,1,31,2012); //31/01/2012
$dtStop = mktime(0,0,0,3,20,2013);  //20/03/2013
$daySecs = 24 * 60 * 60;

echo PHP_EOL;
echo 'Start Date: ',strftime('%d/%m/%Y',$dtStart),PHP_EOL;
echo 'End Date : ',strftime('%d/%m/%Y',$dtStop),PHP_EOL,PHP_EOL;

//----------------------------------------------------------------------------
echo 'Using DateTime::Diff() or date_diff() functions',PHP_EOL;
$dtStart = date_date_set(date_create(),2012,1,31); //31/01/2012
$dtStop = date_date_set(date_create(),2013,3,20); //20/03/2013
$diff = date_diff($dtStart,$dtStop);
echo 'Years : ',$diff->y,PHP_EOL,
'Months : ',$diff->m,PHP_EOL,
'Days : ',$diff->d,PHP_EOL,PHP_EOL;
unset($diff);

//----------------------------------------------------------------------------
echo 'Using custom PHP Source code',PHP_EOL;
function dmydiff($dateS, $dateE)
{
    $dS = getdate($dateS);
    $dE = getdate($dateE);

    $DMY = array('Y'=>0, 'M'=>0, 'D'=>0);

    $DMY['Y'] = $dE['year'] - $dS['year'];
    $DMY['M'] = $dE['mon'] - $dS['mon'];
    $DMY['D'] = $dE['mday'] - $dS['mday'];

    if ($DMY['D'] < 0)
    {
        $dT = mktime(0,0,0,$dS['mon']+1,1,$dS['year']);
        $dT = intval(($dT - $dateS) / (24*60*60));
        $DMY['D'] =  $dT + $dE['mday'] - 1;
        $DMY['M']--;
    }
    if ($DMY['M'] < 0)
    {
        $DMY['Y']--;
        $DMY['M'] += 12;
    }

    return $DMY;
}

$dtStart = mktime(0,0,0,1,31,2012); //31/01/2012
$dtStop = mktime(0,0,0,3,20,2013);  //20/03/2013
$diff = dmyDiff($dtStart, $dtStop);
echo 'Years : ',$diff['Y'],PHP_EOL,
'Months : ',$diff['M'],PHP_EOL,
'Days : ',$diff['D'],PHP_EOL,PHP_EOL;
unset($diff);
//----------------------------------------------------------------------------

?>

One Comment

  1. Ο κώδικας για το αντίστοιχο php extension module βρίσκεται εδώ.
    Οι functions που υποστηρίζονται είναι οι:

    dmyDiff_D($startDate, $endDate);
    dmyDiff_M($startDate, $endDate);
    dmyDiff_Y($startDate, $endDate);
    dmyDiff_DMY($startDate, $endDate);