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
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)
@ 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)):
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.
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)
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
-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".
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.
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
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'.
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.
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.
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)))
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(newFromISO8601('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.
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.
OOP
funciones de fecha y hora de PHP , son muy fáciles de usar.mm/dd/yy
es muy estadounidense, y aquellos de nosotros que vivimos en otras partes del mundo nos ponemos un poco irritables al tratar de adivinar qué significa11-12-13
. El estándar más universal esyyyy-mm-dd
, y es parte del estándar ISO 8601. De lo contrario, debe usar el nombre del mes , no el número.Respuestas:
Si está buscando una manera de normalizar una fecha en formato MySQL, use lo siguiente
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 ladate
funció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)
fuente
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.Para convertir una fecha recuperada de MySQL al formato solicitado (
mm/dd/yy H:M (AM/PM)
):Consulte las opciones de formato de fecha PHP para ajustar el formato.
fuente
$row
supone que es este objeto?Si está utilizando PHP 5, también puede intentar
fuente
("Y-m-d H:i:s")
Referencia: http://php.net/manual/en/function.date.php
fuente
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)
fuente
\DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date);
datetime
columnas deben ser UTF8, así que pasenew DateTimeZone('UTC')
como el tercer parámetro para asegurarse de que PHP lo sepa.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.
fuente
date
función, deberías escribir sobre lastrottime
funció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".Olvidalo todo. Solo usa:
fuente
Para formatear correctamente un
DateTime
objeto 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.
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
fuente
Esto debería formatear un campo en una consulta SQL:
fuente
'%m/%d/%y %h:%i %p'
.Use la función de fecha :
fuente
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:
O un poco más adelantado para que coincida con la pregunta.
fuente
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.
fuente
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 ...Luego, en PHP, simplemente use la
date()
función para formatearla de la manera que desee.o
Me gusta este enfoque en lugar de usar la función de MySQL
DATE_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.
fuente
UNIX_TIMESTAMP
para eliminar la necesidad destrtotime
. Esta respuesta sería mejor si proporcionara un ejemplo de formateo de la hora en el formato que realmente solicitó OP.Puede tener problemas con las fechas que no se devuelven en Unix Timestamp, por lo que esto funciona para mí ...
fuente
Esto funcionará ...
fuente
Usando PHP versión 4.4.9 y MySQL 5.0, esto funcionó para mí:
PubDate
es la columna en MySQL .fuente
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:
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.
fuente
fuente