Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 08/01/2013, à 15:43

Vuel

[PHP] Probléme MkTime et décallage horraire

Bonjour à tous smile !

Voilà je me retrouve confronté à un problème avec les mktime, je vous explique mon soucis.

Je loue une chambre d'hote à la nuit, pour une ou plusieurs nuits. Je rentre donc dans ma bdd chaque jour où le client doit dormir dans ma chambre.

$mkday = 24*3600 // un jour en mktime
$mkdateDebut =  mktime( 0, 0, 0, $mkDateDebut[1], $mkDateDebut[2], $mkDateDebut[0] );
$mkDateFin =  mktime( 0, 0, 0, $mkDateFin[1], $mkDateFin[2], $mkDateFin[0]) -$mkday; //ici je soustrais un mkday car c'est la date où le client part, elle ne sera donc pas prise en compte dans ma BDD pour cette réservation.

/* aprés vérification des disponibilités */

for($i=$mkdateDebut; $i<$mkDateFin;$i+=$mkday)
  {
       /* je rentre ma résa */
  }

Le problème et qu'un client à voulut passer la nuit de 31 mars 2013 au 1er Avril 2013, et là surprise, gros bug ...

Lorsque je fais

echo date("Y-m-d", $mkDateDebut)."<br/>";
echo date("Y-m-d", $mkDateFin)."<br/>";

J'obtiens

2013-03-31
2013-03-30

par contre lorsque je fais ça :

$mkdateDebut =  mktime( 0, 0, 0, $mkDateDebut[1], $mkDateDebut[2], $mkDateDebut[0] );
$mkDateFin =  mktime( 0, 0, 0, $mkDateFin[1], $mkDateFin[2], $mkDateFin[0]) -23*3600;
echo date("Y-m-d", $mkDateDebut)."<br/>";
echo date("Y-m-d", $mkDateFin)."<br/>";

j'obtiens bien :

2013-03-31
2013-03-31

qui est le résultat que j'attends.

Ma question est donc simple après toutes ces explications, comment faire pour prévoir les futurs décalage horaire ? Car effectivement, j'ai testé et en 2014/2015 il n'y a aucun soucis avec cette date là.

Merci de votre attention et de vos potentielles réponses.

Dernière modification par Vuel (Le 08/01/2013, à 15:47)

Hors ligne

#2 Le 08/01/2013, à 16:44

tiramiseb

Re : [PHP] Probléme MkTime et décallage horraire

Je ne rencontre pas ce problème :

php > $date = mktime( 0, 0, 0, 04, 01, 2012);
php > echo date("Y-m-d", $date)."\n";
2012-04-01
php > echo date("Y-m-d", $date-86400)."\n";
2012-03-31
php > echo date("Y-m-d", $date-86401)."\n";
2012-03-30

Dans le cas en erreur, que donne :

echo date("Y-m-d H:i:s", $mkDateFin)."<br/>";

?

Dernière modification par tiramiseb (Le 08/01/2013, à 16:44)

Hors ligne

#3 Le 08/01/2013, à 17:50

Vuel

Re : [PHP] Probléme MkTime et décallage horraire

Bonjour,

C'est normal que tu ne rencontre pas cette erreur avec les dates que tu as rentrés étant donné que tu es resté en 2012 smile.  Il m'a fallut un bout de temps pour arriver à cerner le problème. En 2013 il n'y a que 23*3600 entre le 31/03 et le 04/01, le 31 étant le dernier dimanche de Mars.

J'ai élaboré cette fonction pour palier au problème :

function previousTime($mkDebut,$mkFin)
	{
		$result = 0;
		$mkday = 24*3600;
		$mkdiff = ($mkFin-$mkDebut)%$mkday;
		if($mkdiff == 0)
			{
				$result = $mkFin - $mkday;
			}
		else
			{
				$result = $mkFin - $mkdiff;
			}
		return $result;
	}

(Si il existe une solution plus simple je suis bien sûr preneur).
Cordialement.

Dernière modification par Vuel (Le 08/01/2013, à 17:51)

Hors ligne

#4 Le 08/01/2013, à 17:57

tiramiseb

Re : [PHP] Probléme MkTime et décallage horraire

Ah merde désolé. Saleté de nouvel an ! smile

Il s'agit en effet simplement du changement d'heure en fait ! Tu as le même comportement en 2012 le 25 mars, en 2014 le 30 mars...

Une proposition : tu peux réduire de 12 heures seulement, puis extraire uniquement les champs correspondant à la date en gardant les champs correspondant à l'heure à zero...

Hors ligne

#5 Le 08/01/2013, à 18:03

tiramiseb

Re : [PHP] Probléme MkTime et décallage horraire

J'ajouterais aussi que, si tu te bases sur la date en te disant que de toute façon l'heure, la minute et la seconde restent à zero, tu risque d'avoir des problèmes avec les secondes intercalaires.
http://fr.wikipedia.org/wiki/Seconde_intercalaire

Les jours où il y a une seconde intercalaire, la journée dure 86401 secondes et non 86400 secondes, avec ta soustraction tu te retrouves donc au jour précédent à 00:00:01 et non à 00:00:00.

Et si tu t'en fous complètement des champs "heure", "minute" et "seconde", ça voudrait dire qu'en plus de n'avoir pas de problème avec les secondes intercalaires tu n'aurais aucun souci non plus à soustraire 12 heures, 1 heure, 10 minutes ou 1 minute (*) au lieu de 24 heures, ce qui résoudrait également le problème qui t'a fait ouvrir ce fil de discussion smile

(*): mais surtout pas une seconde smile

Dernière modification par tiramiseb (Le 08/01/2013, à 18:04)

Hors ligne

#6 Le 08/01/2013, à 18:23

Vuel

Re : [PHP] Probléme MkTime et décallage horraire

Effectivement j'avais pas du tout pensée à réduire la durée à 12heures, il ferait des testes et je verrais quelle solution fonctionne le mieux. Dans la BDD il n'y a pas les heures/minutes/seconde. Je sais donc pas du tout ce que ça va donner.

Hors ligne