Conversión de cadena a fecha y fecha y hora

Resuelto Chris Pinski asked hace 54 años • 13 respuestas

Si tengo una cadena PHP en el formato de mm-dd-YYYY(por ejemplo, 16/10/2003), ¿cómo la convierto correctamente a a Datey luego a DateTimeen el formato YYYY-mm-dd? La única razón por la que pido ambos Datees DateTimeporque necesito uno en un lugar y el otro en un lugar diferente.

Chris Pinski avatar Jan 01 '70 08:01 Chris Pinski
Aceptado

Úselo strtotime()en su primera cita y luego date('Y-m-d')vuelva a convertirlo:

$time = strtotime('10/16/2003');

$newformat = date('Y-m-d',$time);

echo $newformat;
// 2003-10-16

Tenga en cuenta que existe una diferencia entre usar barra diagonal /y guión -en la strtotime()función. Para citar de php.net:

Las fechas en los formatos m/d/y o dmy se eliminan al observar el separador entre los distintos componentes: si el separador es una barra (/), entonces se supone el m/d/y americano; mientras que si el separador es un guión (-) o un punto (.), se asume el formato dmy europeo.

Para evitar posibles ambigüedades, es mejor utilizar fechas ISO 8601 (AAAA-MM-DD) o DateTime::createFromFormat() cuando sea posible.

Ibu avatar Jun 04 '2011 19:06 Ibu

Debe tener cuidado con los formatos m/d/Y y mdY. PHP considera /que significa m/d/Y y -significa dmY. Describiría explícitamente el formato de entrada en este caso:

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

De esa manera no estás sujeto a los caprichos de una determinada interpretación.

Matthew avatar Jun 04 '2011 20:06 Matthew

Para analizar la fecha, debes usar: DateTime::createFromFormat();

Ex:

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

Sin embargo, cuidado, porque esto fallará con:

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

En realidad, primero debes verificar que el formato haya ido bien:

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

Ahora, en lugar de fallar, obtendrá una excepción, que puede detectar, propagar, etc.

$dateDE tiene el formato incorrecto, debería ser "16.10.2013";

user2707671 avatar Apr 14 '2014 15:04 user2707671