Formato de fecha () PHP cuando se inserta en fecha y hora en MySQL

324

¿Cuál es el formato correcto para pasar a la date()función en PHP si quiero insertar el resultado en una datetimecolumna de tipo MySQL ?

He estado intentando date("Y-M-D G:i:s")pero eso simplemente inserta "0000-00-00 00:00:00" cada vez.

Alex
fuente
3
dado que no está proporcionando un parámetro hasta la fecha, ¿realmente desea registrar la hora actual?
Mark Elliot

Respuestas:

680

El problema es que está utilizando 'M'y 'D', que son representaciones textuales, MySQL espera una representación numérica del formato2010-02-06 19:30:13

Prueba: date("Y-m-d H:i:s")que usa los equivalentes numéricos.

editar: cambiado Ga H, aunque puede no tener impacto, probablemente desee utilizar el formato de 24 horas con ceros a la izquierda.

Mark Elliot
fuente
28
Este tiene que ser uno de los formatos de fecha y hora más comunes que alguien pueda necesitar. debe ser un php global integrado o parte de la función de fecha en sí (por ejemplo, 'c', 'r')
billynoah
33
Por qué este no es el caso, no lo sé. Tengo que referirme al desbordamiento de pila cada. soltero. marcha. hora.
Mazateca el
11
Es más rápido venir aquí, que buscar en mi código un uso como este.
MRodrigues
64
Acaba de ocurrir una regla mnemotécnica lindo para recordar el formato: " Y nuestra m y d no comió Su ". funciona en muchos niveles :)
IzzEps
2
Debería haber una abreviatura de php para esto, ya que hay para ISO 8601 y RFC 2822
billynoah
105

De los comentarios de la date()página del manual de php :

<?php $mysqltime = date ("Y-m-d H:i:s", $phptime); ?>

Tuviste la 'Y' correcta, es un año completo, pero 'M' es un mes de tres caracteres, mientras que 'm' es un mes de dos dígitos. Mismo problema con 'D' en lugar de 'd'. 'G' es una hora de 1 o 2 dígitos, donde 'H' siempre tiene un 0 inicial cuando es necesario.

Tim Lytle
fuente
1
Gracias @Pekka - Recuerdo cuando tú y yo tuvimos más o menos el mismo representante - has estado bastante activo.
Tim Lytle
1
sí, estoy trabajando mucho en este momento, y SO es mi pasatiempo favorito en el medio :) que cambiará nuevamente.
Pekka
41

Aquí hay una solución alternativa: si tiene la fecha en PHP como marca de tiempo, omita el manejo con PHP y deje que la base de datos se encargue de transformarla utilizando la FROM_UNIXTIMEfunción.

mysql> insert into a_table values(FROM_UNIXTIME(1231634282));
Query OK, 1 row affected (0.00 sec)

mysql> select * from a_table;

+---------------------+
| a_date              |
+---------------------+
| 2009-01-10 18:38:02 |
+---------------------+
JAL
fuente
Esta es una solución elegante
Gracias
2
@trejder, ¿Quién te dijo que hacerlo en mysql es más rápido que hacerlo en php? Hacerlo en PHP es mejor porque la base de datos generalmente es el cuello de botella y desea entrar y salir lo antes posible .
Pacerier
1
@Pacerier, la base de datos es el cuello de botella si tiene una base de datos mal construida, o está ejecutando demasiadas consultas pequeñas en lugar de una consulta única efectiva más sólida, o en muchos casos si confía en un ORM para administrar la base de datos. El SQL sólido con una base de datos relacional bien indexada no es lento.
mopsyd
2
@mopsyd, el DB es el cuello de botella porque escalarlo horizontalmente requiere complejidad. Compare eso con los servidores web que se pueden duplicar en todo el mundo sin ningún cambio de código.
Pacerier
1
Si la consulta falla, se registra en algún lugar y tiene que depurarla, entonces la marca de tiempo es mucho más difícil de leer que la cadena de fecha con formato descrita por @ tim-lytle.
humbads
27

Utilizo el siguiente código PHP para crear una variable que inserto en una columna DATETIME de MySQL.

$datetime = date_create()->format('Y-m-d H:i:s');

Esto mantendrá la fecha y hora actuales del servidor.

Steffan Clent Davies
fuente
12
$date_old = '23-5-2016 23:15:23'; 
//Date for database
$date_for_database = date ("Y-m-d H:i:s", strtotime($date_old));

//Format should be like 'Y-m-d H:i:s'`enter code here`
Ali Umair
fuente
2
Aunque este código puede responder la pregunta, proporcionar un contexto adicional sobre por qué y / o cómo responde la pregunta mejoraría significativamente su valor a largo plazo. Por favor, editar su respuesta a añadir un poco de explicación, y para arreglar sus problemas de formato.
Toby Speight
9

Formatee la marca de tiempo en la columna DATETIME de MySQL:

strftime('%Y-%m-%d %H:%M:%S',$timestamp);
Ahmed Saber
fuente
8

Formatear fecha y hora MySQL con PHP

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

Yo uso esta función (PHP 7)

function getDateForDatabase(string $date): string {
    $timestamp = strtotime($date);
    $date_formated = date('Y-m-d H:i:s', $timestamp);
    return $date_formated;
}

Versiones anteriores de PHP (PHP <7)

function getDateForDatabase($date) {
    $timestamp = strtotime($date);
    $date_formated = date('Y-m-d H:i:s', $timestamp);
    return $date_formated;
}
SandroMarques
fuente
He votado tu respuesta porque funcionó después de editar la primera línea; function getDateForDatabase(string $date) : string {a function getDateForDatabase($date) {¿Por qué las declaraciones de tipo emiten un error que no sé lo suficiente de PHP que contar.
Chris Pink
"El argumento 1 pasado a getDateForDatabase () debe ser una instancia de cadena, cadena dada," - mi entrada fue una cadena,
Chris Pink
7

No es necesario que no use el método date () de PHP si no usa una marca de tiempo. Si datepostedes una columna de fecha y hora, puede insertar la fecha actual de esta manera:

$db->query("INSERT INTO table (dateposted) VALUES (now())");
Adán
fuente
2
Gracias por compartir este enfoque. Es el método más fácil que he visto hasta ahora.
Shondeslitch
2

Esto me ha estado volviendo loco buscando una respuesta simple. Finalmente hice esta función que parece capturar todas las entradas y dar una buena cadena SQL que es correcta o al menos válida y comprobable. Si es 1999-12-31, probablemente esté mal pero no arrojará un error grave en MySQL.

function MakeSQLDate($date) {
    if (is_null($date)) {
        //use 1999-12-31 as a valid date or as an alert
        return date('Y-m-d', strtotime('1999-12-31'));
    }

    if (($t = strtotime($date)) === false) {
        //use 1999-12-31 as a valid date or as an alert
        return date('Y-m-d', strtotime('1999-12-31'));
    } else {
        return date('Y-m-d H:i:s', strtotime($date));
    }
}
Brian Jones
fuente
1

Usando la DateTimeclase en PHP7 +:

function getMysqlDatetimeFromDate(int $day, int $month, int $year): string {
    $dt = new DateTime();
    $dt->setTimezone(new DateTimeZone('UTC'));
    $dt->setDate($year, $month, $day);
    $dt->setTime(0, 0, 0, 0); // set tine to midnight

    return $dt->format("Y-m-d H:i:s");
}
Nino Škopac
fuente
1

Un pequeño anexo a la respuesta aceptada: si la base de datos datetimese almacena como UTC (lo que siempre hago), debe usar en gmdate("Y-m-d H:i:s")lugar de date("Y-m-d H:i:s").

O, si prefiere dejar que MySQL se encargue de todo, como sugieren algunas respuestas, insertaría MySQL UTC_TIMESTAMPcon el mismo resultado.

Nota: entendí la pregunta referente a la hora actual.

Bruno
fuente
0

Esta es una forma más precisa de hacerlo. Coloca decimales detrás de los segundos dando más precisión.

$now = date('Y-m-d\TH:i:s.uP', time());

Note el .uP.

Más información: https://stackoverflow.com/a/6153162/8662476

Maurici Abad
fuente