Probleme avec la fonction time()

WRInaute impliqué
bonjour,

J'ai un petit souci avec time()
A chaque fois qu'un nouvel utilisateur s'enregistre, je récupère le timestamp avec time() et l'insère dans la table, dans l'enregistrement correspondant à l'utilisateur venant de s'enregistrer. Mais chose très bizarre, j'ai des fois des résultats avec 20mn d'avance que l'heure de récupération de time()! Je ne comprends pas, avez vous déjà eu ce phénomène? Le time récupérant l'heure du sevreur, il ne devrait pas y avoir de l'avance par rapport à un autre utilisateur?... Des fois je vois un utilisateur enregistré 20mn après l'heure actuelle... 8O

merci
 
WRInaute impliqué
Les deux... Je fais une liste des derniers utilisateurs inscrits triés par l'id (auto increment) descendant, et j'ai des utilisateurs qui sont en 2eme ou 3eme position avec une heure supérieure à celle des derniers... Mais l'heure utilisé par time() est bien celle du serveur, et celle affichée est prise sur l'enregistrement de la table, donc c'est bien la même heure qui est utilisée...
Bizarre...
 
WRInaute accro
Tu conserves bien le timestamp donné (un nombre, donc un integer dans ta base SQL) tel quel, ou tu le convertis en autre chose (une chaîne de caractères, un timestamp SQL...)?

Dans le deuxième cas, il n'y aurait pas un problème de fuseau horaire différent dans certaines circonstances?

Jacques.
 
WRInaute impliqué
Je le stock en int(11)...
Mais ce que je comprends pas c'est que la plupart fonctionnent, c'est juste un de temps en temps...
 
WRInaute accro
Suis un peu le chemin entre l'appel à time() et le stockage en bdd, il doit y avoir un truc pas net quelque part sur le chemin, forcément. Ajoute des traces en cours de route éventuellement...

Jacques.
 
WRInaute impliqué
Ok, j'ai déjà trouvé un truc, c'est pas time() mais date() qui est utilisé pour récupérer les infos:

Enregistrement :
Code:
$date = date("Y-m-d H:s:i");
$temps = time();
$ip = getenv("REMOTE_ADDR");
$user = strtolower($user);
mysql_query("insert into users set uname='$user', date='$date', timestamp='$temps', ip='$ip', email='$email', actif='0', code_activation='$code_activation', description='$description', login='$login', passwd='$passwd', categorie='$categorie'")or die(mysql_error());
-> Le champs date est "datetime"

Affichage :

Code:
$result=mysql_query("select uname, date from users where actif=1 order by id DESC limit 25");
while(list($uname, $date_nf)=mysql_fetch_array($result)) {
	$date_nf = transform_to_french_date2($date_nf);
                echo "$uname2 ($date_nf)";
}

La fonction transform_to_french_date2 :

Code:
function transform_to_french_date2($echeance){
$month['01']="01";
$month['02']="02";
$month['03']="03";
$month['04']="04";
$month['05']="05";
$month['06']="06";
$month['07']="07";
$month['08']="08";
$month['09']="09";
$month['10']="10";
$month['11']="11";
$month['12']="12";

$year= substr($echeance,0,4);
$monthString=substr($echeance,5,2);
$dayString=substr($echeance,8,2);
$hourMinute=substr($echeance,11,5);

$date_fin = "$dayString/".$month[$monthString]." $hourMinute";
return $date_fin;
 
WRInaute accro
date() renvoie une date en tenant compte du fuseau horaire. Si ce dernier est manipulé d'une façon ou d'une autre, ça va donner des résultats différents. De surcroît, tu stockes donc des informations en double.

Le mieux est de n'utiliser que time(), stocker sous forme d'un entier, et faire la conversion (avec date par exemple) uniquement à l'affichage, qui pourra être ainsi adapté au fuseau horaire de celui qui consulte (plutôt que par celui des utilisateurs originaux).

NB: time renvoie une valeur qui est independante du fuseau horaire puisqu'il s'agit du nombre de secondes depuis le 01/01/1970 00:00:00 UTC.

Jacques.
 
WRInaute impliqué
Effectivement, tu as raison : j'ai récupéré la date depuis le timestamp : date("m/y H:i", $timestamp) et j'ai des valeurs cohérentes!
Merci!
 
Discussions similaires
Haut