Convert one date format into another in PHP


Convert one date format into another in PHP



Is there a simple way to convert one date format into another date format in PHP?



I have this:


$old_date = date('y-m-d-h-i-s'); // works

$middle = strtotime($old_date); // returns bool(false)

$new_date = date('Y-m-d H:i:s', $middle); // returns 1970-01-01 00:00:00



But I'd of course like it to return a current date rather than the crack 'o dawn. What am I doing wrong?





tech-blog.maddyzone.com/php/type-date-convert-php very nice article
– Rituraj ratan
Sep 27 '14 at 7:17




14 Answers
14



The second parameter to date() needs to be a proper timestamp (seconds since January 1, 1970). You are passing a string, which date() can't recognize.


date()



You can use strtotime() to convert a date string into a timestamp. However, even strtotime() doesn't recognize the y-m-d-h-i-s format.


y-m-d-h-i-s



PHP 5.3 and up



Use DateTime::createFromFormat. It allows you to specify an exact mask - using the date() syntax - to parse incoming string dates with.


DateTime::createFromFormat


date()



PHP 5.2 and lower



You will have to parse the elements (year, month, day, hour, minute, second) manually using substr() and hand the results to mktime() that will build you a timestamp.


substr()



But that's a lot of work! I recommend using a different format that strftime() can understand. strftime() understands any date input short of the next time joe will slip on the ice. for example, this works:


the next time joe will slip on the ice


$old_date = date('l, F d y h:i:s'); // returns Saturday, January 30 10 02:06:34
$old_date_timestamp = strtotime($old_date);
$new_date = date('Y-m-d H:i:s', $old_date_timestamp);





Thanks Pekka, just edited my question, tried that but it doesnt seem to work.
– Tom
Jan 30 '10 at 13:02





I edited the answer while you accepted it :) I added some more examples and references.
– Pekka 웃
Jan 30 '10 at 13:07





Gotcha, that's indeed the problem. It's a fixed filename I need to convert back into a date (has to be in that format), so I'll figure out a workaround.
– Tom
Jan 30 '10 at 13:15





thanks its working for me
– Pervaiz Iqbal
Sep 4 '14 at 12:14





Note: According to php.net DateTime exists since PHP 5.2 in PHP core and experimential support for DateTime can be enabled for PHP 5.1 at compilation. secure.php.net/manual/en/datetime.installation.php
– Charlotte Dunois
Oct 14 '16 at 16:49



DateTime


DateTime



The easiest way to do this is


$myDateTime = DateTime::createFromFormat('Y-m-d', $dateString);
$newDateString = $myDateTime->format('m/d/Y');



You are first giving it the format $dateString is in. Then you are telling it the format you want $newDateString to be in.



This also avoids the use of strtotime, which can be hard to work with at times.



If you are not transforming from one date format to another, but just want the current date (or datetime) in a specific format then it's even easier:


$now = new DateTime();
$timestring = $now->format('Y-m-d h:i:s');



This other question also refers to the same topic: Convert date format yyyy-mm-dd => dd-mm-yyyy.





And how is it a duplicate if I asked the question before the one you're referring to?
– Tom
Jul 11 '12 at 17:01





I've edited the response. I just wanted to point out that these two questions should be linked somehow.
– ceiroa
Jul 11 '12 at 18:13





available on in php 5.3+
– Zorox
Jan 12 '13 at 12:40





$timestring = $now->format('Y-m-d h:i:s'); surely? m for months, i for minutes
– Mark Baker
Feb 2 '15 at 8:11


$timestring = $now->format('Y-m-d h:i:s');


m


i





@madlopt ~ static methods: secure.php.net/manual/en/language.oop5.static.php
– ceiroa
Jun 29 '16 at 14:43



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.


strtotime()


date()


strtotime()


date()


$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.


strtotime()


strtotime()



Using DateTime()


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:


DateTime()


DateTime()


$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:


date()


$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:


000


substr()



Trimming the last three digits can be acheived several ways, but using substr() is the easiest:


substr()


$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:


strtotime()


$timestamp = strtotime('1973-04-18');



With DateTime() you can use DateTime::getTimestamp()


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:


U


$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.


DateTime::createFromFormat()


$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:


DateTime()


$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');



Try this:


$old_date = date('y-m-d-h-i-s');
$new_date = date('Y-m-d H:i:s', strtotime($old_date));





Won't work, strtotime() doesn't recognize the format. Just tried.
– Pekka 웃
Jan 30 '10 at 13:16






agreed, i just put in the format code from questioner, there should be proper format specified.
– Sarfraz
Jan 30 '10 at 14:09





It worked for me. My $old_date was something like this 2012-05-22T19:16:37+01:00. Thanks by the way!
– VishwaKumar
May 25 '12 at 8:18



To convert $date from dd-mm-yyyy hh:mm:ss to a proper MySQL datetime
I go like this:


$date


dd-mm-yyyy hh:mm:ss


$date = DateTime::createFromFormat('d-m-Y H:i:s',$date)->format('Y-m-d H:i:s');





You shouldn't chain these methods unless you are 110% sure $date is a valid date and fits the format. With that being said, an invalid date that doesn't exactly match the format will return: Fatal error: Call to a member function format() on a non-object. Just a heads up!
– Half Crazed
Apr 11 '14 at 13:48


Fatal error: Call to a member function format() on a non-object





True, a better solution is to do it in 3 steps with a null check as the middle step.
– Jelle de Fries
Apr 18 '14 at 7:41


$old_date = date('y-m-d-h-i-s'); // works



you are doing wrong here, this should be


$old_date = date('y-m-d h:i:s'); // works



separator of time is ':'



I think this will help...


$old_date = date('y-m-d-h-i-s'); // works

preg_match_all('/(d+)-(d+)-(d+)-(d+)-(d+)-(d+)/', $old_date, $out, PREG_SET_ORDER);
$out = $out[0];
$time = mktime($out[4], $out[5], $out[6], $out[2], $out[3], $out[1]);

$new_date = date('Y-m-d H:i:s', $time);



OR


$old_date = date('y-m-d-h-i-s'); // works

$out = explode('-', $old_date);
$time = mktime($out[3], $out[4], $out[5], $out[1], $out[2], $out[0]);

$new_date = date('Y-m-d H:i:s', $time);





Yes, sure thanks, it's a GUID filename that I want to convert back into a proper date format.
– Tom
Jan 30 '10 at 13:11



The following is an easy method to convert dates to different formats.


// Create a new DateTime object
$date = DateTime::createFromFormat('Y-m-d', '2016-03-25');

// Output the date in different formats
echo $date->format('Y-m-d')."n";
echo $date->format('d-m-Y')."n";
echo $date->format('m-d-Y')."n";



You need to convert the $old_date back into a timestamp, as the date function requires a timestamp as its second argument.



strtotime will work that out. the dates are just not the same and all in us-format.


<?php
$e1 = strtotime("2013-07-22T12:00:03Z");
echo date('y.m.d H:i', $e1);
echo "2013-07-22T12:00:03Z";

$e2 = strtotime("2013-07-23T18:18:15Z");
echo date ('y.m.d H:i', $e2);
echo "2013-07-23T18:18:15Z";

$e1 = strtotime("2013-07-21T23:57:04Z");
echo date ('y.m.d H:i', $e2);
echo "2013-07-21T23:57:04Z";
?>



Try this:


$tempDate = explode('-','03-23-15');
$date = '20'.$tempDate[2].'-'.$tempDate[0].'-'.$tempDate[1];



This native way will help to convert any inputted format to the desired format.


$formatInput = 'd-m-Y'; //Give any format here, this would be converted into your format
$dateInput = '01-02-2018'; //date in above format

$formatOut = 'Y-m-d'; // Your format
$dateOut = DateTime::createFromFormat($formatInput, $dateInput)->format($formatOut);



This solved for me,


$old = '18-04-2018';
$new = date('Y-m-d', strtotime($old));
echo $new;



Output : 2018-04-18



This is the other way you can convert date format


<?php
$pastDate = "Tuesday 11th October, 2016";
$pastDate = str_replace(",","",$pastDate);

$date = new DateTime($pastDate);
$new_date_format = $date->format('Y-m-d');

echo $new_date_format.' 23:59:59'; ?>



Just using strings, for me is a good solution, less problems with mysql. Detects the current format and changes it if necessary, this solution is only for spanish/french format and english format, without use php datetime function.


class dateTranslator {

public static function translate($date, $lang) {
$divider = '';

if (empty($date)){
return null;
}
if (strpos($date, '-') !== false) {
$divider = '-';
} else if (strpos($date, '/') !== false) {
$divider = '/';
}
//spanish format DD/MM/YYYY hh:mm
if (strcmp($lang, 'es') == 0) {

$type = explode($divider, $date)[0];
if (strlen($type) == 4) {
$date = self::reverseDate($date,$divider);
}
if (strcmp($divider, '-') == 0) {
$date = str_replace("-", "/", $date);
}
//english format YYYY-MM-DD hh:mm
} else {

$type = explode($divider, $date)[0];
if (strlen($type) == 2) {

$date = self::reverseDate($date,$divider);
}
if (strcmp($divider, '/') == 0) {
$date = str_replace("/", "-", $date);

}
}
return $date;
}

public static function reverseDate($date) {
$date2 = explode(' ', $date);
if (count($date2) == 2) {
$date = implode("-", array_reverse(preg_split("/D/", $date2[0]))) . ' ' . $date2[1];
} else {
$date = implode("-", array_reverse(preg_split("/D/", $date)));
}

return $date;
}



USE


dateTranslator::translate($date, 'en')




Thank you for your interest in this question.
Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).


Would you like to answer one of these unanswered questions instead?

Popular posts from this blog

List of Kim Possible characters

Audio Livestreaming with Python & Flask

NSwag: Generate C# Client from multiple Versions of an API