unixtime - PHP-MYSQL: Convertir la marca de tiempo de Unix a DateTime y viceversa
time since epoch mysql (5)
¿Por qué no simplemente usar la función FROM_UNIXTIME en mysql?
Im usando php 5.4.6 y MySQL 5.5.29 y tengo problemas al convertir un TIMESTAMP de UNIX a DATETIME MYSQL y viceversa. Mysql y php wun en la misma máquina local.
Tengo una mesa mysql simple
CREATE TABLE Entry(
id SERIAL PRIMARY KEY,
created DATETIME NOT NULL);
Para insertar datos utilizo php PDO y mysql NOW (). Esto funciona bien, la fecha y hora correcta se almacena en la base de datos.
Mi plan es trabajar con las marcas de tiempo de Unix en el lado del cliente (php y mysql en el lado del servidor).
Así que me gustaría entregar las marcas de tiempo de Unix a mi cliente. Por lo tanto, uso la función MySql UNIX_TIMESTAMP () para convertirla directamente en la consulta.
Así que una consulta de muestra se ve así:
SELECT created, UNIX_TIMESTAMP(created) AS TS FROM Entry
El resultado: creado = 2013-02-14 20:47:35 TS = 1360871255
Así que ahora quiero hacer lo contrario, paso la marca de tiempo de UNIX y quiero compararla con las entradas de mi base de datos. Desafortunadamente no puedo escribir un script PHP que funcione. No sé por qué, pero cuando paso la misma marca de tiempo (1360871255) a PHP, no obtengo el 2013-02-14 20:47:35 con este método:
public static function toDateTime($unixTimestamp){
return date("Y-m-d H:m:s", $unixTimestamp);
}
Cuando llamo a DateTime (1360871255) devolverá 2013-02-14 20:02:35 que no es el DateTime original.
Lo sé, no necesito formatear 1360871255 a un Ymd H: m: s para usarlo en MYSQL, pero 1360871255 no parece ser el momento que esperaba (y MYSQL UNIX_TIMESTAMP ha regresado).
Lo que quiero hacer es una consulta simple que me muestre Entradas que son más antiguas que una determinada marca de tiempo, algo tan simple como esto:
SELECT * FROM Entry WHERE created < 1360871255
pero como mencioné antes, el resultado de la consulta no es el esperado, porque 1360871255 parece no ser el momento correcto.
No especifico ninguna zona horaria especial para la conexión mysql en php.
¿Alguna sugerencia?
El problema radica en la función que escribiste:
return date("Y-m-d H:m:s", $unixTimestamp);
Usted especifica el mes (m) en las partes de fecha y hora. Debe reemplazar la segunda m con i , la marca correcta para las horas cuando use date () en PHP.
return date("Y-m-d H:i:s", $unixTimestamp);
Dependiendo de sus necesidades, puede encontrar la función PHP strtotime () lo suficientemente útil.
Su formato de fecha es incorrecto ... i
es por minuto, no m
(meses).
return date("Y-m-d H:i:s", $unixTimestamp);
Algunas notas laterales:
- No es necesario volver a asignar, es decir,
$unixTimestamp = $unixTimestamp;
- Ya que estás usando PHP> 5.3. Usted puede estar interesado en el nuevo objeto DateTime .
nada de ambos. debe guardar la marca de tiempo como INT
o BIGINT
porque si usa el formato TIMESTAMP
de mysql nunca lo volverá a un int
. Solo puedes obtener algo como esto 1970-01-01 01:00:00
.
function format_date($str) {
$month = array(" ", "Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec");
$y = explode('' '', $str);
$x = explode(''-'', $y[0]);
$date = "";
$m = (int)$x[1];
$m = $month[$m];
$st = array(1, 21, 31);
$nd = array(2, 22);
$rd = array(3, 23);
if(in_array( $x[2], $st)) {
$date = $x[2].''st'';
}
else if(in_array( $x[2], $nd)) {
$date .= $x[2].''nd'';
}
else if(in_array( $x[2], $rd)) {
$date .= $x[2].''rd'';
}
else {
$date .= $x[2].''th'';
}
$date .= '' '' . $m . '', '' . $x[0];
return $date;
}