2008-09-25 25 views
386

Tengo una columna datetime en MySQL.Convertir de fecha y hora de MySQL a otro formato con PHP

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

+4

Lo que necesitamos saber es cómo se almacena la fecha en el SQL. ¿Es Timestamp o Datetime o unixtime? –

+0

No se almacenan en tiempo Unix, al igual que una fecha normal, PHP es el que se ocupa de él como segundos y demás. Te recomendaría utilizar las funciones de fecha y hora PHP 'OOP', son muy fáciles de usar. –

+0

¿Puedo recomendar y alternativa a su formato de fecha? 'mm/dd/aa' es muy estadounidense, y aquellos de nosotros que vivimos en otras partes del mundo nos irritamos un poco al tratar de adivinar lo que significa' 11-12-13'. El estándar más universal es 'aaaa-mm-dd', y es parte del estándar ISO 8601. De lo contrario, debe usar el mes _name_, no el número. – Manngo

Respuesta

285

Para convertir una fecha recuperada de MySQL en el 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 la PHP date formatting options para ajustar el formato.

+5

Podría tener un trabajo, pero no es el formato estándar mysql. – levhita

+327

El formato estándar de MySQL es: 'date (" Y-m-d H: i: s ", $ datetime)' – Andy

+0

¿De dónde se supone que es el objeto '$ row'? – Mike

12

Una manera más fácil sería formatear la fecha directamente en la consulta de MySQL, en lugar de PHP. Vea el MySQL manual entry for DATE_FORMAT.

Si prefieres hacerlo en PHP, entonces necesitas la función date, pero primero tendrás que convertir el valor de tu base de datos en una marca de tiempo.

+10

-1 porque la fecha de formateo en DB no es buena idea. La web multilenguaje necesita formatos de fecha diferentes y luego debe formatear la fecha en PHP (lenguaje de lógica de negocios en común). Cuando escribiste sobre la función 'date', deberías escribir sobre la función' strottime' 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". –

+0

fecha de preformateo no es una idea buena y escalable –

7

utilizar la función date:

<?php 
    echo date("m/d/y g:i (A)", $DB_Date_Field); 
?> 
+0

Consulte a continuación qué funcionó mejor para mí: –

+24

¿La función date() no espera una indicación de fecha y hora entera en lugar de una fecha y hora especificada en la pregunta? – Loftx

+0

@TimBoland ya no está "debajo" sino "arriba"! felicitaciones;) – noelicus

3

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

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

Luego, en PHP sólo tiene que utilizar la función date() darle formato de cualquier 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 utilizar MySQL 's función DATE_FORMAT, ya que le permite volver a utilizar la misma consulta para agarrar los datos y le permite modificar el formato de PHP.

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

+0

Me gusta la idea de usar 'UNIX_TIMESTAMP' para eliminar la necesidad de' strtotime'. Esta respuesta sería mejor si proporcionara un ejemplo de formato de la hora en el formato que realmente solicitó OP. – toxalot

101

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

$oDate = new DateTime($row->createdate); 
$sDate = $oDate->format("Y-m-d H:i:s"); 
+1

+1 Este es el camino a seguir si tiene PHP 5> = 5.2.0 – toxalot

+0

Como se indicó anteriormente en los comentarios, el formato estándar es '(" Y-m-d H: i: s ")' – Yannickv

+0

funciona para mí. cambiado – enobrev

0

Al usar la versión de PHP 4.4.9 & MySQL 5.0, esto funcionó para mí:

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

PubDate es la columna en MySQL .

+0

Esto no convierte la fecha al formato solicitado por OP – toxalot

1

Puede tener problemas con las fechas que no se devuelvan en tiempo UNIX, por lo que este funciona para mí ...

return date("F j, Y g:i a", strtotime(substr($datestring, 0, 15))) 
+1

Esto no convierte la fecha al formato solicitado por OP. – toxalot

459

Si usted está buscando una manera de normalizar una fecha en formato de MySQL, utilice el siguiente

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

La línea $phpdate = strtotime($mysqldate) acepta una cadena y lleva a cabo una serie de heurísticas para convertir esa cadena en una fecha Unix.

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

(Editor Nota: Esta respuesta es aquí debido a una pregunta original con redacción confusa, y el general utilidad Google esta respuesta proporcionada incluso si didnt' responder directamente a la pregunta que ahora existe)

+8

Gracias, será la última vez que copie y pegue antes de leer los comentarios. – Samir

+16

esta respuesta confunde el tema –

+1

'Ymd H: i: s' es el formato estándar correcto de fecha y hora (lea el manual de MySQL, todos los ejemplos usan este formato) – 0xBAADF00D

8

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

SELECT DATE_FORMAT(`fieldname` , '%d-%m-%Y') FROM tablename 
+0

Debe especificar la consulta * MySQL *, no solo SQL, porque eso no necesariamente funcionará con todas las bases de datos. Mientras que OP solicitó una solución PHP, esta es una buena alternativa que OP puede no haber sabido. Sin embargo, esto no proporcionará el formato solicitado. Para obtener el formato OP solicitado, necesitarías ''% m /% d /% y% h:% i% p''. – toxalot

10

Olvidar todo. Sólo tiene que utilizar:

$date = date("Y-m-d H:i:s",strtotime(str_replace('/','-',$date))) 
+3

-1, esto no coincide con el formato solicitado por el OP. – user7116

+0

Solución terrible –

30
$valid_date = date('m/d/y g:i A', strtotime($date)); 

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

+0

Creo que las personas votaron negativamente porque están confundidas con la pregunta de OP. La mayoría de ellos leen que la pregunta es 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 http://php.net/function.date.php sería mejor. – toxalot

+0

@toxalot La respuesta aceptada es incorrecta. Se editó después de mi respuesta y sobre mi enlace, reemplace su enlace. Gracias –

9

Para formatear correctamente un objeto DateTime en PHP MySQL para almacenar en utilizar el formato normalizado 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 la cadena manualmente cada vez.

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

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

+0

MySQL en realidad no usa este formato, y MySQL genera una advertencia si incluye el designador de zona horaria "+ xxxx" que se genera. UPDATE X SET Y = '2014-03-31T15: 00: 00 + 0100' donde Z; Pregunta OK, 0 filas afectadas, 1 advertencia (0.06 seg) Filas coincidentes: 1 Modificado: 0 Advertencias: 1 –

+0

OP quiere tomar una fecha *** de *** Formato MySQL y convertir * a * ** mm/dd/aa H: M (AM/PM) **. – toxalot

-1
$date = "'".date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $_POST['date'])))."'"; 
+1

Esto no responde la pregunta OP. OP quiere tomar una fecha * de * formato MySQL y convertir * a * ** mm/dd/a H: M (AM/PM) **. Esto hace lo opuesto. Además, toma la entrada de un formulario en lugar de la base de datos. – toxalot

5

Dependiendo de la 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 avance un poco más 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)); 
} 
+1

Esto no responde la pregunta OP. OP quiere tomar una fecha * de * formato MySQL y convertir * a * ** mm/dd/a H: M (AM/PM) **. Además, esto solo formateará la hora actual, no una fecha específica. – toxalot

1

Esto funcionará ...

echo date('m/d/y H:i (A)',strtotime($data_from_mysql)); 
+1

Ese formato 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

14

Finalmente la solución adecuada para PHP 5.3 y superiores:

$date = DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date); 
echo $date->format('m/d/y h:i a'); 
+0

es un error .. Clase 'App \ Controller \ DateTime' no encontrada ..utilizando php 6.4 – aswzen

+0

Si está trabajando en otro espacio de nombres, tiene que llamarlo con una barra invertida delante de él: '\ DateTime :: createFromFormat (' Ymd H: i: s ', $ mysql_source_date); ' – Hasenpriester

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 cada función 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 operador como como en el ejemplo anterior (como dateFrom, como dateUntil). Los nombres que escriba allí son los nombres, las filas serán llamadas en su resultado.

La salida de este ejemplo será

[día del mes, numéricos (0..31)]. [Nombre del mes (January..December)]. [Año, numérico, cuatro dígitos]

Ejemplo: 5.Agosto.2015

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

Cuestiones relacionadas