Convierta de fecha y hora MySQL a otro formato con PHP

447

Tengo una datetimecolumna en MySQL.

¿Cómo puedo convertirlo a la pantalla como mm / dd / aa H: M (AM / PM) usando PHP?

Tim Boland
fuente
44
Lo que necesitamos saber es cómo se almacena la fecha en el SQL. ¿Es marca de tiempo o fecha y hora o unixtime?
Ólafur Waage
Se almacenan no en tiempo de Unix, al igual que una fecha normal, PHP es el que lo maneja como segundos y demás. Le recomendaría que use las OOPfunciones de fecha y hora de PHP , son muy fáciles de usar.
Gucho Ca
2
¿Puedo recomendar una alternativa a su formato de fecha? mm/dd/yyes muy estadounidense, y aquellos de nosotros que vivimos en otras partes del mundo nos ponemos un poco irritables al tratar de adivinar qué significa 11-12-13. El estándar más universal es yyyy-mm-dd, y es parte del estándar ISO 8601. De lo contrario, debe usar el nombre del mes , no el número.
Manngo

Respuestas:

515

Si está buscando una manera de normalizar una fecha en formato MySQL, use lo siguiente

$phpdate = strtotime( $mysqldate );
$mysqldate = date( 'Y-m-d H:i:s', $phpdate );

La línea $phpdate = strtotime( $mysqldate )acepta una cadena y realiza una serie de heurísticas para convertir esa cadena en una marca de tiempo de Unix.

La línea $mysqldate = date( 'Y-m-d H:i:s', $phpdate )usa esa marca de tiempo y la datefunción de PHP para convertir esa marca de tiempo nuevamente en el formato de fecha estándar de MySQL.

( Nota del editor : esta respuesta está aquí debido a una pregunta original con una redacción confusa, y la utilidad general de Google que esta respuesta proporcionó incluso si no respondía directamente la pregunta que ahora existe)

kta
fuente
19
esta respuesta confunde el tema
Alex K
55
@ 0xBAADF00D: lea la pregunta nuevamente ... nadie preguntó sobre el formato estándar de MySQL.
user7116
3
por supuesto, pero, cuando existe el estándar, podría ser bueno seguir el estándar (evitará el dolor de cabeza más tarde cuando otro desarrollador trabaje en su código) xD
0xBAADF00D
44
La pregunta pide que salga en el formato mm / dd / aa H: M (AM / PM), no "Ymd H: i: s".
Rikki
66
does not work¿para quien? La respuesta aceptada funcionará si desea convertir de MySQL a mm / dd / aa H: M (AM / PM) según lo solicitado por OP. El hecho de que quieras hacer lo contrario no hace que la respuesta aceptada sea incorrecta.
toxalot
311

Para convertir una fecha recuperada de MySQL al formato solicitado ( mm/dd/yy H:M (AM/PM)):

// $datetime is something like: 2014-01-31 13:05:59
$time = strtotime($datetimeFromMysql);
$myFormatForView = date("m/d/y g:i A", $time);
// $myFormatForView is something like: 01/31/14 1:05 PM

Consulte las opciones de formato de fecha PHP para ajustar el formato.

Tim Boland
fuente
¿De dónde se $rowsupone que es este objeto?
Mike
25
Podría estar equivocado, pero creo que algunos de ustedes están perdiendo el punto. Quiere que la salida esté en formato "m / d / yg: i A", extrayendo la fecha original de un campo DATETIME. Entonces su código funciona. @Mike $ row-> createdate es solo la columna de fecha y hora de Tim.
Mera Development
44
La respuesta de @AsTeR solo es confusa si lee mal la pregunta. OP respondió su propia pregunta y quiere tomar una fecha de MySQL y enviarla al formato solicitado: mm / dd / aa H: M (AM / PM) .
toxalot
@TimBoland Creo que la respuesta podría mejorar si de se puso de relieve, así como el formato solicitado dd / mm / aa H: M (AM / PM) . Y podría beneficiarse de un enlace a la función de fecha. Intenté sugerir una edición , pero fue rechazada.
toxalot
1
Dato curioso: esta respuesta es más o menos equivalente a la que se encuentra justo debajo (que prácticamente no tiene votos negativos), pero obtuvo> 40 votos negativos porque responde a la pregunta del OP, que difiere de la que realmente tienen las personas que vienen a esta página.
Clément
110

Si está utilizando PHP 5, también puede intentar

$oDate = new DateTime($row->createdate);
$sDate = $oDate->format("Y-m-d H:i:s");
enobrev
fuente
Como se indicó anteriormente en los comentarios, el formato estándar es("Y-m-d H:i:s")
Yannickv
45
$valid_date = date( 'm/d/y g:i A', strtotime($date));

Referencia: http://php.net/manual/en/function.date.php

Tony Stark
fuente
Creo que las personas votan negativamente porque están confundidas con la pregunta OP. La mayoría lee la pregunta como lo contrario de lo que realmente es. La otra posibilidad es que esto sea muy similar a la respuesta aceptada que se publicó hace más de 5 años.
toxalot
1
El enlace al que hace referencia no apunta a la función que está utilizando, ni explica el formato. Creo que php.net/function.date.php sería mejor.
toxalot
@toxalot La respuesta aceptada es incorrecta. Se editó después de mi respuesta y sobre mi enlace. Reemplazo su enlace. Gracias
Tony Stark
1
Todo este Q&A tiene una historia sórdida. La respuesta aceptada fue incorrecta entre el 29 de abril de 2013 y el 24 de mayo de 2013. Fue correcta la primera vez que publicó su respuesta. Su respuesta fue incorrecta hasta el 29 de mayo de 2013, después de lo cual se volvió muy similar a la respuesta aceptada.
toxalot 01 de
23

Finalmente, la solución correcta para PHP 5.3 y superior: (se agregó una zona horaria opcional al ejemplo como se menciona en los comentarios)

$date = \DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date, new \DateTimeZone('UTC'));
$date->setTimezone(new \DateTimeZone('Europe/Berlin')); // optional
echo $date->format('m/d/y h:i a');
Hasenpriester
fuente
su error ... No se encontró la clase 'App \ Controller \ DateTime' ... usando php 6.4
aswzen el
1
Si está trabajando en otro espacio de nombres, debe llamarlo con una barra diagonal inversa:\DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date);
Hasenpriester
2
¡No olvide especificar la zona horaria cuando cree su objeto de fecha! De lo contrario, su fecha formateada podría estar varias horas libre. Sus datetimecolumnas deben ser UTF8, así que pase new DateTimeZone('UTC')como el tercer parámetro para asegurarse de que PHP lo sepa.
Eric Seastrand
Esta es la respuesta correcta que genera el formato deseado del OP, solo cuide las zonas horarias
Contador م
12

Una forma más fácil sería formatear la fecha directamente en la consulta MySQL, en lugar de PHP. Consulte la entrada manual de MySQL para DATE_FORMAT .

Si prefiere hacerlo en PHP, entonces necesita la función de fecha , pero primero deberá convertir el valor de su base de datos en una marca de tiempo.

destello
fuente
11
-1 porque la fecha de formateo en DB no es buena idea. La web multilenguaje necesita diferentes formatos de fecha y luego debe formatear la fecha en PHP (lenguaje de lógica de negocios en común). Cuando escribiste sobre la datefunción, deberías escribir sobre la strottimefunción también para ayudar a alguien en lugar de "pero primero tendrás que convertir el valor de tu base de datos en una marca de tiempo".
Boris Šuška
10

Olvidalo todo. Solo usa:

$date = date("Y-m-d H:i:s",strtotime(str_replace('/','-',$date)))
nixis
fuente
9

Para formatear correctamente un DateTimeobjeto en PHP para almacenarlo en MySQL, utilice el formato estandarizado que utiliza MySQL, que es ISO 8601 .

PHP ha tenido este formato almacenado como una constante desde la versión 5.1.1, y recomiendo usarlo en lugar de escribir manualmente la cadena cada vez.

$dtNow = new DateTime();
$mysqlDateTime = $dtNow->format(DateTime::ISO8601);

Esto y una lista de otras constantes de fecha y hora de PHP están disponibles en http://php.net/manual/en/class.datetime.php#datetime.constants.types

Greg
fuente
MySQL en realidad no usa este formato, y MySQL genera una advertencia si incluye el designador de zona horaria "+ xxxx" que genera. ACTUALIZACIÓN X SET Y = '2014-03-31T15: 00: 00 + 0100' donde Z; Consulta correcta, 0 filas afectadas, 1 advertencia (0.06 segundos) Filas coincidentes: 1 Modificado: 0 Advertencias: 1
George Lund
OP quiere tomar una fecha del formato MySQL y convertir a mm / dd / aa H: M (AM / PM) .
toxalot
8

Esto debería formatear un campo en una consulta SQL:

SELECT DATE_FORMAT( `fieldname` , '%d-%m-%Y' ) FROM tablename
riz
fuente
Debe especificar la consulta MySQL , no solo SQL, porque eso no necesariamente funcionará con todas las bases de datos. Si bien OP solicitó una solución PHP, esta es una buena alternativa que OP no conocía. Sin embargo, esto no proporcionará el formato solicitado. Para obtener el formato OP solicitado, necesitará '%m/%d/%y %h:%i %p'.
toxalot
7

Use la función de fecha :

<?php
    echo date("m/d/y g:i (A)", $DB_Date_Field);
?>
Gustavo Carreño
fuente
25
¿La función date () no espera una marca de tiempo entera en lugar de una fecha y hora especificada en la pregunta?
Loftx
5

Dependiendo de su configuración de fecha y hora de MySQL. Típicamente: 2011-12-31 07:55:13 formato. Esta función muy simple debería hacer la magia:

function datetime()
{
    return date( 'Y-m-d H:i:s', time());
}

echo datetime(); // display example: 2011-12-31 07:55:13

O un poco más adelantado para que coincida con la pregunta.

function datetime($date_string = false)
{
    if (!$date_string)
    {
        $date_string = time();
    }
    return date("Y-m-d H:i:s", strtotime($date_string));
}
tfont
fuente
1
Esto no responde a la pregunta de OP. OP quiere tomar una fecha del formato MySQL y convertir a mm / dd / aa H: M (AM / PM) . Además, esto solo formateará la hora actual, no una fecha específica.
toxalot
5
SELECT 
 DATE_FORMAT(demo.dateFrom, '%e.%M.%Y') as dateFrom,
 DATE_FORMAT(demo.dateUntil, '%e.%M.%Y') as dateUntil
FROM demo

Si no desea cambiar todas las funciones en su código PHP, para mostrar el formato de fecha esperado, cámbielo en la fuente: su base de datos.

Es importante nombrar las filas con el as operador como en el ejemplo anterior (como dateFrom, como dateUntil). Los nombres que escriba allí son los nombres, las filas se llamarán en su resultado.

La salida de este ejemplo será

[Día del mes, numérico (0..31)]. [Nombre del mes (enero ... diciembre)]. [Año, numérico, cuatro dígitos]

Ejemplo: 5 de agosto de 2015

Cambie los puntos con el separador de su elección y verifique la función DATE_FORMAT (fecha, formato) para obtener más formatos de fecha.

Rangel
fuente
3

También puede hacer que su consulta devuelva la hora como una marca de tiempo de Unix. Eso eliminaría la necesidad de llamar strtotime()y hacer las cosas un poco menos intensivas en el lado de PHP ...

select  UNIX_TIMESTAMP(timsstamp) as unixtime from the_table where id = 1234;

Luego, en PHP, simplemente use la date()función para formatearla de la manera que desee.

<?php
  echo date('l jS \of F Y h:i:s A', $row->unixtime);
?>

o

<?php
  echo date('F j, Y, g:i a', $row->unixtime);
?>

Me gusta este enfoque en lugar de usar la función de MySQLDATE_FORMAT , porque le permite reutilizar la misma consulta para capturar los datos y le permite alterar el formato en PHP.

Es molesto tener dos consultas diferentes solo para cambiar la apariencia de la fecha en la interfaz de usuario.

phatduckk
fuente
Me gusta la idea de usar UNIX_TIMESTAMPpara eliminar la necesidad de strtotime. Esta respuesta sería mejor si proporcionara un ejemplo de formateo de la hora en el formato que realmente solicitó OP.
toxalot
1

Puede tener problemas con las fechas que no se devuelven en Unix Timestamp, por lo que esto funciona para mí ...

return date("F j, Y g:i a", strtotime(substr($datestring, 0, 15)))
matt.j.crawford
fuente
1
Esto no convierte la fecha al formato solicitado por OP.
toxalot
1

Esto funcionará ...

echo date('m/d/y H:i (A)',strtotime($data_from_mysql));
Mihir Vadalia
fuente
1
Ese formato se mezcla 24 veces con AM / PM. De lo contrario, es lo mismo que la respuesta aceptada que se publicó hace más de 5 años.
toxalot
0

Usando PHP versión 4.4.9 y MySQL 5.0, esto funcionó para mí:

$oDate = strtotime($row['PubDate']);
$sDate = date("m/d/y",$oDate);
echo $sDate

PubDatees la columna en MySQL .

Peter Mortensen
fuente
Esto no convierte la fecha al formato solicitado por OP
toxalot
0

El enfoque que sugiero funciona de la siguiente manera. Primero, crea un objeto básico de fecha y hora a partir de una cadena con formato mysql; y luego lo formateas como quieras. Afortunadamente, mysql datetime es compatible con ISO8601, por lo que el código en sí podría parecer bastante simple y elegante. Sin embargo datetime, tenga en cuenta que esa columna no tiene información de zona horaria, por lo que debe convertirla adecuadamente .

Aquí está el código:

(new ISO8601Formatted(
    new FromISO8601('2038-01-19 11:14:07'),
    'm/d/Y h:iA'
))
    ->value();

Sale 01/19/2038 11:14AM , con suerte lo que espera.

Este ejemplo utiliza la biblioteca de merengue. Puedes ver un poco más si te apetece.

Vadim Samokhin
fuente
-1
$date = "'".date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $_POST['date'])))."'";
SagarPPanchal
fuente
1
Esto no responde a la pregunta de OP. OP quiere tomar una fecha del formato MySQL y convertir a mm / dd / aa H: M (AM / PM) . Esto hace lo contrario. Además, toma información de un formulario en lugar de la base de datos.
toxalot