¿Cuál es el formato correcto para pasar a la date()
función en PHP si quiero insertar el resultado en una datetime
columna 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.
¿Cuál es el formato correcto para pasar a la date()
función en PHP si quiero insertar el resultado en una datetime
columna 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.
Respuestas:
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 G
a H
, aunque puede no tener impacto, probablemente desee utilizar el formato de 24 horas con ceros a la izquierda.
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.
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_UNIXTIME
funció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 |
+---------------------+
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.
$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`
Formatee la marca de tiempo en la columna DATETIME de MySQL:
strftime('%Y-%m-%d %H:%M:%S',$timestamp);
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;
}
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.
No es necesario que no use el método date () de PHP si no usa una marca de tiempo. Si dateposted
es una columna de fecha y hora, puede insertar la fecha actual de esta manera:
$db->query("INSERT INTO table (dateposted) VALUES (now())");
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));
}
}
Usando la DateTime
clase 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");
}
Un pequeño anexo a la respuesta aceptada: si la base de datos datetime
se 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_TIMESTAMP
con el mismo resultado.
Nota: entendí la pregunta referente a la hora actual.
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