The Basics
The simplist way to convert one date format into another is to use strtotime()
with date()
. strtotime()
will convert the date into a Unix Timestamp. That Unix Timestamp can then be passed to date()
to convert it to the new format.
$timestamp = strtotime('2008-07-01T22:35:17.02');
$new_date_format = date('Y-m-d H:i:s', $timestamp);
Or as a one-liner:
$new_date_format = date('Y-m-d H:i:s', strtotime('2008-07-01T22:35:17.02'));
Keep in mind that strtotime()
requires the date to be in a valid format. Failure to provide a valid format will result in strtotime()
returning false which will cause your date to be 1969-12-31.
Using DateTime()
As of PHP 5.2, PHP offered the DateTime()
class which offers us more powerful tools for working with dates (and time). We can rewrite the above code using DateTime()
as so:
$date = new DateTime('2008-07-01T22:35:17.02');
$new_date_format = $date->format('Y-m-d H:i:s');
Working with Unix timestamps
date()
takes a Unix timeatamp as its second parameter and returns a formatted date for you:
$new_date_format = date('Y-m-d H:i:s', '1234567890');
DateTime() works with Unix timestamps by adding an @
before the timestamp:
$date = new DateTime('@1234567890');
$new_date_format = $date->format('Y-m-d H:i:s');
If the timestamp you have is in milliseconds (it may end in 000
and/or the timestamp is thirteen characters long) you will need to convert it to seconds before you can can convert it to another format. There's two ways to do this:
substr()
Trimming the last three digits can be acheived several ways, but using substr()
is the easiest:
$timestamp = substr('1234567899000', -3);
You can also convert the timestamp into seconds by dividing by 1000. Because the timestamp is too large for 32 bit systems to do math on you will need to use the BCMath library to do the math as strings:
$timestamp = bcdiv('1234567899000', '1000');
To get a Unix Timestamp you can use strtotime()
which returns a Unix Timestamp:
$timestamp = strtotime('1973-04-18');
With DateTime() you can use DateTime::getTimestamp()
$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->getTimestamp();
If you're running PHP 5.2 you can use the U
formatting option instead:
$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->format('U');
Working with non-standard and ambiguous date formats
Unfortunately not all dates that a developer has to work with are in a standard format. Fortunately PHP 5.3 provided us with a solution for that. DateTime::createFromFormat()
allows us to tell PHP what format a date string is in so it can be successfully parsed into a DateTime object for further manipulation.
$date = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM');
$new_date_format = $date->format('Y-m-d H:i:s');
In PHP 5.4 we gained the ability to do class member access on instantiation has been added which allows us to turn our DateTime()
code into a one-liner:
$new_date_format = (new DateTime('2008-07-01T22:35:17.02'))->format('Y-m-d H:i:s');
$new_date_format = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM')->format('Y-m-d H:i:s');