web-dev-qa-db-fra.com

PHP-MYSQL: Conversion de l'horodatage Unix en DateTime et vice versa

im using php 5.4.6 et MySQL 5.5.29 et j'ai des ennuis en convertissant un TIMESTAMP UNIX en MYSQL DATETIME et vice versa. Mysql et php wun sur la même machine locale.

J'ai une simple table mysql

CREATE TABLE Entry(
id SERIAL PRIMARY KEY,
created DATETIME NOT NULL);

Pour insérer des données, j'utilise php PDO et mysql NOW (). Cela fonctionne correctement, la date/heure correcte est stockée dans la base de données.

Mon plan est de travailler avec des timestamps Unix côté client (php et mysql côté serveur).

Je voudrais donc livrer des timestamps Unix à mon client. Par conséquent, j’utilise la fonction MySql UNIX_TIMESTAMP () pour le convertir directement dans la requête.

Donc, un exemple de requête ressemble à ceci:

SELECT created, UNIX_TIMESTAMP(created) AS TS FROM Entry

Le résultat: Created = 2013-02-14 20:47:35 TS = 1360871255

Alors maintenant, je veux faire l'inverse, je passe le timestamp UNIX et je veux le comparer aux entrées de ma base de données. Malheureusement, je ne parviens pas à écrire un script PHP qui fonctionne. Je ne sais pas pourquoi, mais lorsque je passe le même horodatage (1360871255) à PHP, je ne reçois pas le 14/02/2013 20:47:35 avec cette méthode:

public static function toDateTime($unixTimestamp){
    return date("Y-m-d H:m:s", $unixTimestamp);
}

Lorsque j'appelle toDateTime (1360871255), le message retourné le 14/02/2013 à 20:02:35, qui n'est pas le DateTime d'origine.

Je sais, je n'ai pas besoin de formater 1360871255 en Y-m-d H: m: s pour l'utiliser dans MYSQL, mais 1360871255 ne semble pas être l'heure à laquelle j'attendais (et MYSQL UNIX_TIMESTAMP est de retour).

Ce que je veux faire est une requête simple qui me montre les entrées plus anciennes qu'un certain horodatage, quelque chose de simple comme ceci:

SELECT * FROM Entry WHERE created < 1360871255

mais comme je l'ai mentionné précédemment, le résultat de la requête n'est pas celui attendu, car 1360871255 ne semble pas être l'heure correcte.

Je ne spécifie aucun fuseau horaire spécial pour la connexion mysql en php.

Aucune suggestion?

23
sockeqwe

Votre format de date est incorrect ... i est pour minute, pas m (mois).

return date("Y-m-d H:i:s", $unixTimestamp);

Quelques notes de côté:

  • Il n'est pas nécessaire de réaffecter, c'est-à-dire $unixTimestamp = $unixTimestamp;
  • Puisque vous utilisez PHP> 5.3. vous pourriez être intéressé par le nouvel objet DateTime .
40
Jason McCreary

Le problème réside dans la fonction que vous avez écrite:

return date("Y-m-d H:m:s", $unixTimestamp);

Vous spécifiez mois (m) dans les parties date et heure. Vous devez remplacer le second m par i , le drapeau correct pour les heures lorsque vous utilisez date () en PHP.

return date("Y-m-d H:i:s", $unixTimestamp);

En fonction de vos besoins, la fonction PHP de strtotime () peut être utile.

3
BadAlgorithm

Pourquoi ne pas simplement utiliser la fonction FROM_UNIXTIME dans mysql?

2
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;
}
0
user3723383

rien des deux. vous devriez enregistrer l’horodatage sous la forme INT ou BIGINT car si vous utilisez le format TIMESTAMP de mysql, vous ne le retrouverez jamais dans une int. Vous pouvez seulement obtenir quelque chose comme ceci 1970-01-01 01:00:00.

0
joshi21