Conversión de cadena a fecha y fecha y hora
Si tengo una cadena PHP en el formato de mm-dd-YYYY
(por ejemplo, 16/10/2003), ¿cómo la convierto correctamente a a Date
y luego a DateTime
en el formato YYYY-mm-dd
? La única razón por la que pido ambos Date
es DateTime
porque necesito uno en un lugar y el otro en un lugar diferente.
Ú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.
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.
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";