[RESOLU] 2 timestamp différents retournent la même valeur

Avatar du membre
Mammouth du PHP | 1564 Messages

01 déc. 2012, 23:14

Bonjour,

je code des dates et je suis arrivé à un résultat inattendu et pas très compréhensif, voila pourquoi je viens vous demander pourquoi:

ces deux timestamp, retourne la même valeur, soit "10-12-2012 18:33"

9945099000 et 1355164380

testé avec les fonction strtotime() et date() comme ceci:


1. j'ai un timestamp, celui ci: 9945099000
2. je le converti en str, comme ceci: date("d-m-Y H:i",9945099000)
3. si je prend le résultat et que je fait l'inverse, comme ceci:
$echo = date("d-m-Y H:i",9945099000);
echo strtotime($echo);
j'obtiens: 1355164380
4. quand je converti 1355164380 en str, j'obtiens 10-12-2012 18:33 ...

Avatar du membre
Mammouth du PHP | 1609 Messages

01 déc. 2012, 23:25

Salut, j'ai testé :
echo date("d-m-Y H:i",9945099000);// 23-02-2285 08:30
echo date("d-m-Y H:i",1355164380);// 10-12-2012 19:33
Ça retourne bien 2 dates différentes... ^^

EDIT faut se méfier de strtotime quand même. Je ne connais pas les finesses de la fonction mais je pense qu'elle peut conduire à des résultats surprenant si on ne s'en sert pas comme il faut.
Juste un exemple : si tu balances disons le 03-12-2012 ça pourrait aussi bien être du d-m-Y (3 décembre) que du m-d-Y (12 mars) et strtotime doit bien choisir l'un ou l'autre (y a surement des explications dans la doc et à mon avis y a surement un format précis à respecter).
Modifié en dernier par Saian le 01 déc. 2012, 23:38, modifié 1 fois.
Développeur web depuis + de 20 ans

Avatar du membre
Mammouth du PHP | 1564 Messages

01 déc. 2012, 23:37

je suis désolé mais pour moi (WAMPSERVER 2.0) le résultat est le même avec ce code:
$a = "9945099000";
$b = "1355164380";
echo  date("d-m-Y H:i",$a)."<br />";
echo  date("d-m-Y H:i",$b);
:shock:

EDIT: il y a quand même une différence de 28 secondes entre chaque avec ce code (en rajoutant le s):
$a = "9945099000";
$b = "1355164380";
echo  date("d-m-Y H:i:s",$a)."<br />";
echo  date("d-m-Y H:i:s",$b);

Avatar du membre
Mammouth du PHP | 1609 Messages

01 déc. 2012, 23:47

Cherche pas midi à 14 heure, si le timestamp diffère c'est forcément que strtotime n'a pas interprété la date comme du d-m-Y H:i
Un peu de documentation si ça te travaille : http://php.net/manual/fr/datetime.formats.php

EDIT suite à tes 3 derniers messages, je penche pour un problème de "localisation" sur ton installation locale. Tu peux regarder du côté de la fonction setlocale.
Modifié en dernier par Saian le 02 déc. 2012, 01:14, modifié 5 fois.
Développeur web depuis + de 20 ans

Avatar du membre
Mammouth du PHP | 1564 Messages

02 déc. 2012, 00:04

tout ce que j'ai pu en tirer, c'est:
Note:

Si le chiffre des années est précisé sur deux chiffres, les valeurs entre 00-69 correspondent à 2000-2069 et 70-99 à 1970-1999. Voyez les notes après concernant les différences possibles entres systèmes 32-bit (des dates peuvent échouer après le 19/01/2038 à 03:14:07).
surtout le "de 1901 à 2038", ma date allant jusqu'à plus de 2080, l'erreur est donc là

Avatar du membre
Mammouth du PHP | 1564 Messages

02 déc. 2012, 00:07

Je suis rassuré, je viens de tester sur un de mes sites et le résultat est bien:

Code : Tout sélectionner

23-02-2285 08:30:00 10-12-2012 19:33:00
:D

Avatar du membre
Mammouth du PHP | 1564 Messages

02 déc. 2012, 00:11

@Saian: pour ta supposition tout à l'heure
faut se méfier de strtotime quand même. Je ne connais pas les finesses de la fonction mais je pense qu'elle peut conduire à des résultats surprenant si on ne s'en sert pas comme il faut.
La doc dit:
si le séparateur est un tiret (-) ou un point (.), alors le format Européen d-m-y sera supposé.
Donc pas de problème pour mon format.

Eléphanteau du PHP | 10 Messages

02 déc. 2012, 00:27

le pb venait du fait que la valeur 9945099000 dépasse la valeur maximale autorisée pour un integer, laquelle varie d'une plateforme à une autre.

si tu fais :
echo PHP_INT_MAX . '<br>';
echo (9945099000 % PHP_INT_MAX);
ça te donne : sous windows 32
2147483647
1355164408

d'où le lien entre les deux dates (ou presque)

Avatar du membre
Mammouth du PHP | 1564 Messages

02 déc. 2012, 00:36

et vous en local avec votre OS, vous obtenez quel résultat ?

j'ai windows XP 64 bits

Avatar du membre
Mammouth du PHP | 1609 Messages

02 déc. 2012, 00:36

Et donc quand tu écris date("d-m-Y H:i",9945099000), 9945099000 est converti comme cela 9945099000 % PHP_INT_MAX ? =D>

EDIT je suis sous mac os x en 64 bits et ça me retourne ça
9223372036854775807
9945099000
Modifié en dernier par Saian le 02 déc. 2012, 01:29, modifié 2 fois.
Développeur web depuis + de 20 ans

Avatar du membre
Mammouth du PHP | 1564 Messages

02 déc. 2012, 00:43

non, ta fonction:
echo PHP_INT_MAX . '<br>';
echo (9945099000 % PHP_INT_MAX);
me retourne:

2147483647
1355164408

(je me demande si je suis bien en 64 bits, j'arrive pas à trouver :mrgreen: )

Avatar du membre
Mammouth du PHP | 1609 Messages

02 déc. 2012, 00:52

EDIT @two3d désolé, j'aurai pas du être aussi catégorique mon hypothèse était fausse... mea culpa
EDIT merci audaxman pour la précision (en dessous) ;)
Modifié en dernier par Saian le 02 déc. 2012, 01:17, modifié 12 fois.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 10 Messages

02 déc. 2012, 01:01

Et donc quand tu écris date("d-m-Y H:i",9945099000), 9945099000 est converti comme cela 9945099000 % PHP_INT_MAX ? =D>
ça dépend de la plateforme, mais oui, c'est un comportement en fait très naturel qui est issu du fait que la variables est stockée en binaire, et du coup si tu converti un nombre en integer il te renvoie le modulo PHP_INT_MAX du nombre que tu lui a envoyé