If you've ever wanted to convert a date of a UK vehicle into a nice looking representation of the year code then you've came to the right place!
I've written a small PHP function to convert a given date to one of the following formats:
-
Dates before Feb 1963
-
[YEAR] - i.e. "1960", "1962"
-
-
Dates from Feb 1963 - August 2001
-
[SUFFIX/PREFIX LETTER] ([YEAR]) - i.e. "V (1999)", "A (1983)"
-
-
Dates from September 2001 onwards
-
[AGE IDENTIFIER] ([YEAR]) - i.e. "57 (2007)", "57 (2008)", "60 (2010)"
-
/* getRegistrationCode *********************************************
* Get the age identifier from a UK vehicle registration plate from
* a given date. Returns the identifier as a string with the year
* of registration in brackets.
*
* $registrationDate The date of registration to be converted
*
* return String representation of the registration
* date
******************************************************************/
function getRegistrationCode( $registrationDate ) {
$reg = $registrationDate;
$year = (int) date( "Y", strtotime( $registrationDate ) );
$month = (int) date( "n", strtotime( $registrationDate ) );
$date = date( "Y-m-d", strtotime( $regestrationDate ) );
/* < FEBRUARY 1963 *********************************************
* If the registration year is 1962 or before then just return
* the year
**************************************************************/
if( $date < "1963-02-01" ) {
$reg = "".$year;
/* FEBRUARY 1963 - AUGUST 2001 *********************************
* For registrations from 1963 to August 2001 look up the
* appropriate registration letter
**************************************************************/
} elseif( $date <= "2001-08-31" ) {
$yearLetters = array(
"1963-02-01" => 'A', // 1 Feb 1963 - 31 Dec 1963
"1964-01-01" => 'B', // 1 Jan 1964 - 31 Dec 1964
"1965-01-01" => 'C', // 1 Jan 1965 - 31 Dec 1965
"1966-01-01" => 'D', // 1 Jan 1966 - 31 Dec 1966
"1967-01-01" => 'E', // 1 Jan 1967 - 31 Jul 1967
"1967-08-01" => 'F', // 1 Aug 1967 - 31 Jul 1968
"1968-08-01" => 'G', // 1 Aug 1968 - 31 Jul 1969
"1969-08-01" => 'H', // 1 Aug 1969 - 31 Jul 1970
"1970-08-01" => 'J', // 1 Aug 1970 - 31 Jul 1971
"1971-08-01" => 'K', // 1 Aug 1971 - 31 Jul 1972
"1972-08-01" => 'L', // 1 Aug 1972 - 31 Jul 1973
"1973-08-01" => 'M', // 1 Aug 1973 - 31 Jul 1974
"1974-08-01" => 'N', // 1 Aug 1974 - 31 Jul 1975
"1975-08-01" => 'P', // 1 Aug 1975 - 31 Jul 1976
"1976-08-01" => 'R', // 1 Aug 1976 - 31 Jul 1977
"1977-08-01" => 'S', // 1 Aug 1977 - 31 Jul 1978
"1978-08-01" => 'T', // 1 Aug 1978 - 31 Jul 1979
"1979-08-01" => 'V', // 1 Aug 1979 - 31 Jul 1980
"1980-08-01" => 'W', // 1 Aug 1980 - 31 Jul 1981
"1981-08-01" => 'X', // 1 Aug 1981 - 31 Jul 1982
"1982-08-01" => 'Y', // 1 Aug 1982 - 31 Jul 1983
"1983-08-01" => 'A', // 1 Aug 1983 - 31 Jul 1984
"1984-08-01" => 'B', // 1 Aug 1984 - 31 Jul 1985
"1985-08-01" => 'C', // 1 Aug 1985 - 31 Jul 1986
"1986-08-01" => 'D', // 1 Aug 1986 - 31 Jul 1987
"1987-08-01" => 'E', // 1 Aug 1987 - 31 Jul 1988
"1988-08-01" => 'F', // 1 Aug 1988 - 31 Jul 1989
"1989-08-01" => 'G', // 1 Aug 1989 - 31 Jul 1990
"1990-08-01" => 'H', // 1 Aug 1990 - 31 Jul 1991
"1991-08-01" => 'J', // 1 Aug 1991 - 31 Jul 1992
"1992-08-01" => 'K', // 1 Aug 1992 - 31 Jul 1993
"1993-08-01" => 'L', // 1 Aug 1993 - 31 Jul 1994
"1994-08-01" => 'M', // 1 Aug 1994 - 31 Jul 1995
"1995-08-01" => 'N', // 1 Aug 1995 - 31 Jul 1996
"1996-08-01" => 'P', // 1 Aug 1996 - 31 Jul 1997
"1997-08-01" => 'R', // 1 Aug 1997 - 31 Jul 1998
"1998-08-01" => 'S', // 1 Aug 1998 - 28 Feb 1999
"1999-03-01" => 'T', // 1 Mar 1999 - 31 Aug 1999
"1999-09-01" => 'V', // 1 Sep 1999 - 29 Feb 2000
"2000-03-01" => 'W', // 1 Mar 2000 - 31 Aug 2000
"2000-09-01" => 'X', // 1 Sep 2000 - 28 Feb 2001
"2001-03-01" => 'Y', // 1 Mar 2001 - 31 Aug 2001
);
// Loop through the letters until we hit a date that's after
// our registration date
foreach( $yearLetters as $key => $letter ) {
$reg = $letter." (".$year.")";
if( $key > $date )
break;
}
/* SEPTEMBER 2001 ONWARDS **************************************
* For registrations since September 2001 use the current
* 00 - 99 numbering scheme based on the year.
**************************************************************/
} else {
/* CALCULATE THE REG CODE **********************************
* New style registration years run from the start of March
* to the end of February of the next year.
*
* The two digit year value represents the March - August
* identifier (i.e. 09, 10) and 50 is added to the year for
* the September - February identifier (i.e. 59, 60).
*
* To calculate the registration code we must follow the
* steps below:
* - YEAR % 50
* - if MONTH < 3 subtract 1
* - Add 50 if MONTH > 8 or MONTH < 3
*
* Giving us:
* ( YEAR % 50 ) + ( ( MONTH < 3 ) ? 49 : ( MONTH > 8 ) ? 50 : 0 )
*/
$reg = ( $year % 50 ) +
( ( $month < 3 ) ? 49 : ( ( $month > 8 ) ? 50 : 0 ) );
$reg = str_pad( $reg, 2, "0", STR_PAD_LEFT )." (".$year.")";
}
return $reg;
}
The function above should convert all dates since 1963 to codes. It should also hold true for the future as the current partern is a 50 year repeating one (lest they change it of course).
- Chris