Преобразование строки в Date и DateTime

Если у меня есть строка PHP в формате mm-dd-YYYY (например, 10-16-2003), как правильно преобразовать ее в Date а затем DateTime в формате YYYY-mm-dd ? Единственная причина, по которой я запрашиваю Date и DateTime – это то, что мне нужно одно в одном месте, а другое – в другом месте.

Используйте strtotime() в вашем первом дате, а затем date('Ym-d') чтобы преобразовать его:

 $time = strtotime('10/16/2003'); $newformat = date('Ym-d',$time); echo $newformat; // 2003-10-16 

Обратите внимание, что существует разница между использованием функции косой черты / и дефиса - в функции strtotime() . Процитировать по php.net:

Даты в форматах m / d / y или dmy устраняются неоднозначно, глядя на разделитель между различными компонентами: если разделитель является косой чертой (/), то предполагается, что американский m / d / y; тогда как если разделитель является тире (-) или точкой (.), тогда предполагается европейский формат dmy.

Вы должны быть осторожны с форматами m / d / Y и mdY. PHP рассматривает / означает m / d / Y и - означает dmY. В этом случае я бы явным образом описал формат ввода:

 $ymd = DateTime::createFromFormat('md-Y', '10-16-2003')->format('Ym-d'); 

Таким образом, вы не находитесь в капризе определенной интерпретации.

 $d = new DateTime('10-16-2003'); $timestamp = $d->getTimestamp(); // Unix timestamp $formatted_date = $d->format('Ym-d'); // 2003-10-16 

Изменить: вы также можете передать конструктор DateTimeZone в DateTime (), чтобы обеспечить создание даты для требуемого часового пояса, а не для сервера по умолчанию.

Чтобы проанализировать дату, вы должны использовать: DateTime :: createFromFormat ();

Пример:

 $dateDE = "16/10/2013"; $dateUS = \DateTime::createFromFormat("dmY", $dateDE)->format("m/d/Y"); 

Однако, осторожно, потому что это сбой:

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

Вам действительно нужно проверить, что форматирование прошло хорошо, сначала:

 $dateDE = "16/10/2013"; $dateObj = \DateTime::createFromFormat("dmY", $dateDE); if (!$dateObj) { throw new \UnexpectedValueException("Could not parse the date: $date"); } $dateUS = $dateObj->format("m/d/Y"); 

Теперь вместо сбоя вы получите исключение, которое вы можете поймать, размножить и т. Д.

$ dateDE имеет неправильный формат, он должен быть «16.10.2013»;

Если вы используете PHP 5.2 или high, используйте DateTime, как указано выше. Эта статья поможет.