2010-01-05 6 views
2

PLATFORM: PHP & mySQLPHP mySQL - UNIX_TIMESTAMP est pas égal à StrToTime

je stocke la date + fois dans la base de données dans le format suivant: Date ("Y-m-d H: i: s"). Un exemple d'une valeur que j'ai dans ma base de données est: 2010-01-05 07:36:33. Dans mon scénario, je l'ai réglé le fuseau horaire que date_default_timezone_set("America/Chicago");

PROBLÈME:

Je l'ai lu quelque part le UNIX_TIMESTAMP et j'utilisais que dans ma requête. La valeur de UNIX_TIMESTAMP sur une valeur de date du DB, semble être différente de la strotime (DB date Value).

Exemple:

Considèrent que l'une des valeurs DB pour la colonne de date dans mon DB est 2010-01-05 07:36:33 Maintenant, si cette date je vais chercher de la manière suivante :

$result = mysql_query("SELECT date, UNIX_TIMESTAMP(date) AS ut_date FROM table"); 
$row = mysql_fetch_row($result); 

//The result of this is: 
$row['date'] = 2010-01-05 07:36:33 
$row['ut_date'] = 1262657193 
strtotime($row['date']) gives 1262698593 

Pour mes autres calculs dans mon application, j'ai besoin de travailler avec strtotime (date). J'ai beaucoup de comparaisons à faire de cette façon. Mon problème aurait résolu, si UNIX_TIMESTAMP (date) était identique à strtotime (date). L'un des exemple de requête que je dois travailler avec, est:

$gap = 1; // time in minutes 
$tm2 = date ("Y-m-d H:i:s", mktime (date("H"),date("i")-$gap,date("s"),date("m"),date("d"),date("Y"))); 
$target = strtotime($tm2); 

$result2 = mysql_query("UPDATE table2 SET stat = 0 WHERE UNIX_TIMESTAMP(today_login_time) < $target "); 

Ce qui précède me donne des résultats incorrects. Si j'essaie de remplacer UNIX_TIMESTAMP par strtotime dans la requête ci-dessus, cela me donne une erreur car la fonction strtotime semble être la fonction PHP et non la fonction mySQL correspondante. Y a-t-il une fonction mySQL respective pour le strtotime? Comment puis-je résoudre le problème ci-dessus? Le code pour résoudre le problème ci-dessus est très apprécié.

Merci d'avance.

Répondre

7

Les fuseaux horaires de votre serveur MySQL et de votre instance php sont probablement différents. par exemple.

echo date('Y-m-d H:i:s T', 1262657193);

imprime sur ma machine 2010-01-05 03:06:33 CET (note le fuseau horaire CET, c'est UTC + 1) alors que votre serveur MySQL interprète le même horodatage unix comme 2010-01-05 07:36:33

voir http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html
et http://docs.php.net/datetime.configuration#ini.date.timezone

+0

J'ai configuré le fuseau horaire comme date_default_timezone_set ("America/Chicago"). Alors, comment puis-je résoudre cela maintenant? Je vous remercie. – Devner

+0

par exemple. en définissant le même fuseau horaire pour le serveur MySQL, soit globalement (par exemple dans son fichier .ini), soit par session ('SET time_zone = 'America/Chicago'' devrait fonctionner). Vous pouvez également toujours revenir au fuseau horaire UTC en utilisant UTC_TIMESTAMP() de MySQL ou en envoyant simplement l'horodatage unix via UNIX_TIMESTAMP(), voir http://dev.mysql.com/doc/refman/5.1/fr/date-and-time -functions.html – VolkerK

+0

Merci pour l'info. Donc, je viens d'utiliser SET time_zone = 'America/Chicago'; en haut du script pour faire ce travail? Cela sera-t-il suffisant? Je ne suis pas sûr si l'hébergeur me donnera le fichier .ini à modifier. Donc, si c'est quelque chose que je peux gérer via mon codage dans les scripts, ce sera génial. S'il vous plaît, faites-moi savoir. Je vous remercie. – Devner

1

vous n'avez pas besoin de convertir l'horodatage sql en unix pour une requête where. il suffit d'utiliser DATE_FORMAT cela rend les choses beaucoup plus simple:

WHERE DATE_FORMAT(`today_login_time`, "%Y-%m-%d") < '.date('Y-m-d', $my_tsp) 
+0

Merci pour le commentaire. Qu'est-ce que $ my_tsp exactement? Comment puis-je implémenter votre solution dans mon code? – Devner

+0

Eh bien, je n'ai pas compris ce que votre requête est en train de faire. mais $ my_tsp peut être n'importe quelle chaîne avec une date qui a ce format AAAA-MM-JJ. – antpaw

+0

J'essaye de mettre à jour la stat à 0, dans le cas où le datetime dans DB a plus de 1 minute. Donc, je calcule l'heure actuelle, en soustrayant 1 minute de cela (appelons cette cible $) et en essayant de vérifier s'il existe une date-heure qui a une valeur inférieure à la cible $. Cela a-t-il du sens? Je vais devoir m'assurer que la différence est comptée jusqu'à la dernière seconde avec précision, alors comment est-ce que je modifierais votre solution pour cela? S'il vous plaît, faites-moi savoir. Je vous remercie. – Devner

1

Puisque la différence est exactement 11,5 heures, il semble que vous rencontrez des problèmes avec les fuseaux horaires.

+0

Oui, date_default_timezone_set ("America/Chicago") est le fuseau horaire de mon script. Comment puis-je le résoudre maintenant? Merci. – Devner

0

La date de format ("Y-m-d H: i: s") ne décrit pas précisément une date et une heure car elle n'inclut pas de fuseau horaire. Comme aucun fuseau horaire n'est fourni, le serveur Web et la base de données utilisent leurs fuseaux horaires qui sont clairement différents.

Vous devez envisager de stocker les dates dans la base de données sous la forme d'un horodatage unix.Un horodatage unix correspond uniquement au nombre de secondes écoulées depuis l'époque Unix (1er janvier 1970 00:00:00 GMT). Cela n'est pas affecté par les fuseaux horaires ou les économies d'heures. De cette façon, vous n'aurez qu'à vous soucier des fuseaux horaires et de l'heure d'été lors de la conversion en jour et heure.

+0

Merci pour le commentaire, Larry. Je voulais juste souligner une préoccupation que j'avais et pourquoi j'utilisais datetime pour stocker ma date et l'heure. Voici un extrait de la référence mysql: "Le type de données TIMESTAMP a une plage de '1970-01-01 00:00:01' UTC à '2038-01-19 03:14:07' UTC". Nous sommes déjà en 2010, à seulement 28 ans de la valeur maximale de la gamme après laquelle, je m'attends à des valeurs imprévisibles, si l'horodatage est utilisé. Donc je voulais l'éviter et le résoudre en utilisant datetime à la place. Est-il possible de le résoudre maintenant? (J'utilise default_timezone_set ("America/Chicago") dans mes scripts) – Devner