Source of: get_age.php (Download Source)
Last Modified: Fri, 16 Feb 2007 13:38:18 UTC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?php
function in_str($needle,$haystack) {
    return strpos($haystack, $needle) !== false;
}


/* Allowed input formats:
 * 3 parameters: (ints)
 *   day, month, year (2-digit or 4-digit year)
 *   year, month, day (4-digit year)
 *
 * 1 parameter: (string)
 *   YYYY-MM-DD (trailing time will be ignored)
 *   YY-MM-DD
 *   DD.MM.YYYY
 *   DD.MM.YY
 *   MM/DD/YYYY
 *   MM/DD/YY
 *   YYYYMMDD
 *   YYMMDD
 *
 * When a 2-digit year is used, the function checks if the year is greater than
 * the current year in 2-digit form. If yes, the last century is used, the
 * current century otherwise.
 *   
 * When passing something other than the mentioned formats, consider the
 * behaviour undefined.
 */
function age() 
{
    // current year, month and day
    list($cyear, $cmonth, $cday) = explode(' ', strftime("%Y %m %d")); 
    // Allow multiple date input formats
    switch (func_num_args()) {
    case 1: // A date string, now check it's format
        $date = trim(array_shift(func_get_args()));
        if (in_str('-', $date)) {
            // iso date 
            list($byear, $bmonth, $bday) = preg_split('/-| /',$date);
        } elseif (in_str('.', $date)) {
            list($bday, $bmonth, $byear) = explode('.', $date);
        } elseif (in_str('/', $date)) {
            list($bmonth, $bday, $byear) = explode('/', $date);
        } else {
            // let's try yyyymmdd or yymmdd
            if (strlen($date) > 6) {
                $byear  = substr($date, 0, 4);
                $bmonth = substr($date, 4, 2);
                $bday   = substr($date, 6, 2);
            } else {
                $byear  = substr($date, 0, 2);
                $bmonth = substr($date, 2, 2);
                $bday   = substr($date, 4, 2);
            }
        }
    break;
    case 3:
        list($bday,$bmonth,$byear) = func_get_args();
        if ($bday > 99) {
            list($bday,$byear) = array($byear,$bday);
        }
    }
    if ($byear < 100) {
        $cent = substr($cyear, 0, 2);
        if ($byear < strftime('%y')) {
            $byear = $cent.$byear;
        } else {
            $byear = --$cent.$byear;
        }
    }
    $age = $cyear - $byear; 
    if ($cmonth < $bmonth OR ($cmonth == $bmonth AND  $cday < $bday)) {
        $age -=1;
    }
    return $age; 
}

?>